先上示例。正则表达式的使用方法不唯一,下文代码仅供参考。
简而言之:Pattern类定义正则表达式,Matcher类进行匹配和输出结果。
Pattern p = Pattern.compile("(c[a-z])[a-z]"); Matcher m = p.matcher("vacation cost"); while(m.find()) System.out.println(m.group(1));//依次输出符合正则表达式第一个括号(c[a-z])字符串的结果 m.reset();//重置匹配结果 m.region(5, 12);//设定匹配范围索引[5, 12) while(m.find()) System.out.println(m.group());//依次输出符合整个正则表达式的匹配结果
最重要的两个类是Pattern和Matcher。以下介绍这两个类中的常用方法。
\[\]Pattern类
Pattern compile(String regex) 将给定的字符串转换为正则匹配模式。要求字符串符合正则表达式规范。
boolean matches(String regex, String s) 返回匹配是否成功。
matcher()
\[\]Pattern p = Pattern.compile("a*b"); Pattern p = Pattern.compile("");//括号内可以写regex,最终计算的regex以matches方法为准 String reg = "c*b"; String s = "aaaaab"; boolean isMatch = p.matches(res, s);//false boolean isMatch = Pattern.matches("a*b", "aaaaaaab");//true
Matcher类
boolean find(int start) 返回是否匹配到一个合法字符串。start缺省时从上一次匹配成功后的位置开始匹配。
boolean matches() 返回给定串是否完全符合正则表达式。
boolean lookingAt() 返回给定串的前缀部分是否符合正则表达式。
find(), lookingAt()和matches()的区别:只要给定字符串的 \([start, end]\) 范围内存在合法串,find()就会返回true;给定字符串的前缀部分(长度任意)满足正则表达式,lookingAt()返回true;给定字符串必须完全符合正则表达式,matches()才会返回true。
例如:
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("vacation");
System.out.println(m.matches());//false
System.out.println(m.find());//true
System.out.println(m.find());//false
m = p.matcher("catalog");
System.out.println(m.matches());//false
System.out.println(m.lookingAt());//true
System.out.println(p.matches("cat", "vacation"));//false
Matcher region(int start, int end) 设定匹配时字符串的上下界,即 \([start, end)\) 。
String group() 返回上一次匹配成功时的匹配串。
String group(int g) 返回对正则表达式中第g个括号内内容的匹配结果。group(0)等价于group()。
int groupCount() 返回正则表达式中的括号组数
Matcher reset() 重置匹配状态
\[\]几点补充
Java检查正则表达式时会保留换行符(但不会自动添加换行符)。举个例子:
Pattern p = Pattern.compile("q[^u]");
Matcher m = p.matcher("q\n");
while(m.find())
System.out.println(m.group()); //输出q
可以看到,Java将\n也视作一个字符,因此"q\n"匹配成功。但如果将表达式改为"q",则不会产生匹配结果。