注:
第0组(d(a(b))(c))
第1组 d(a(b))(c)
第2组 a(b)
第3组 b
一、正则表达式的概述和简单使用
- 概述: 是指一个用来描述或者匹配一系列符合某个语法规则的单个字符串,其实就是一种规则,有自己特殊的应用,(简单来讲,就是符合某种规则的字符串)
- String类的新方法
public boolean matchs( String regex );// 判断该字符串是否匹配给定的正则表达式
举例: boolean flag = qq.matchs( regex );// 就是判断qq这个字符串和给定的规则符不符合
二、正则表达式的规则字符
学习pattern类,了解规则:
- 字符:
n :字符n,任意字符代表自己本身,当字符单独存在时。
\ : 反斜线字符,代表一个\,第一个是转义字符。
\r : 回车
\n:换行 - 字符类
[ abc ] a,b,c字符出现一次,写在中括号里表示需要匹配的指定字符
[ ^abc ] 可以是任意字符,但除了abc,表示匹配任意字符都可以除了中括号内的字符
[ a-zA-Z] a到z 或A到Z,两头的字母包括在内,表示所有英文字母任意一个出现一次
[ 0-9 ] 任意的数字出现一次 - 预定义字符类
. 任意的字符,单独的.代表任意字符
\d 数字[ 0-9 ] ,代表0-9.取代了[ 0-9 ]
\w 单词字符,[a-zA-Z_0-9] ,英文、数字及下划线才叫单词字符 - 边界匹配器
^ 行的开头,以什么开头
$ 行的结尾 ,以什么结尾
\b 单词边界,也就是说这里出现的不能是单次字符
举例: abc hello world?haha - Greedy 数量词
X?X 一次货一次也没有
X*X 零次或多次
X+X 一次或多次
X{ n } 恰好n次
X{ n, } 至少n次
X{ n, m } 至少n次,但不超过m次
三、正则表达式的功能
- 判断功能
String类中public boolean matches(String regex)
判断该字符串 是否符合给定的正则表达式
举例:
boolean flag = qq.matches(regex);
判断qq这个字符串是否符合我们给定的规则regex - 切割功能
使用String类的split(regex)方法
a 切割单个空格的规则 ,“空格”;
b 切割多个空格的规则, “空格+”;
c 切割路径的规则, String str=“E:\java\20150403”,将\\作为字符串进spilt中;
d 切割叠词的规则,(.)\1+;
注:
(d(a(b))(c))第4组 c - 替换功能
使用的是String类中的public String replaceAll(String regex,String replacement)
用给定的字符串替换符合正则规则的字符串
replacement这个地方可以通过$符来引用调用这个方法字符串中组的内容
String s = "我...我我...我...我要学...学学...学学...编程" ;
String ss = s.replaceAll( "\\.", "");
String sss = ss.replaceAll( "(.)\\1+", "$1");
System. out.println( sss);
- 获取功能
//把正则表达式编译成模式对象
Pattern p = Pattern.compile("a*b");
//通过模式对象调用匹配器方法,得到匹配器对象
Matcher m = p.matcher("aaaaab");
//通过匹配对象使用Matcher类中public boolean find()方法,尝试查找与该模式匹配的输入序列的下一个子序列(理解,类似于在大串种查找小串)
boolean b=m.find( );
//再使用Matcher类中的public String group( );返回由以前匹配操作所匹配的操作子序列。
举例:
public static void main(String[] args) {
// // 把正则表达式编译成模式对象
// Pattern p = Pattern.compile("a*b");
// // 通过模式对象调用匹配方法获取到匹配器对象
// Matcher m = p.matcher("aaaaab");
// // 调动匹配器对象的判断功能
// boolean b = m.matches();
// System.out.println(b);
// 这道题目我们还可以通过判断功能
// String regex = "a*b";
// String str = "aaaaab";
// boolean flag = str.matches(regex);
// System.out.println(flag);
// 定义规则
String regex = "\\b[a-z]{3}\\b";
String str = "da jia zhu yi le, ming tian bu fang jia, xie xie!";
// 想要获取3个字符组成的单词
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
// public boolean find()
// 判断看是否存在有满足条件的子串
// boolean flag = m.find();
// System.out.println(flag);
// //获取子串
// //public String group()
// String s = m.group();
// System.out.println(s);
while(m.find()){
System.out.println(m.group());
}
}
四、综合练习
获取文件中的邮箱
步骤:
a:创建字符高效流读取数据
b:把读取到的每一行数据进行查找
c:把符合正则条件的字符串储存到集合中
d:遍历集合
public static void main(String[] args) throws IOException {
// 通过字符输入流读取数据。
BufferedReader br = new BufferedReader(new FileReader("mail.txt"));
// 创建一个集合
ArrayList<String> array = new ArrayList<String>();
// 定义邮箱规则
String regex = "\\w+@\\w{2,8}(\\.\\w{2,3})+";
String line = null;
while ((line = br.readLine()) != null) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(line);
while (m.find()) {
array.add(m.group());
}
}
// 遍历集合。
for (String s : array) {
System.out.println(s);
}
}
网友评论