在Java中使用正则表达式非常方便,使用
Pattern与Matcher两个类就可以满足需求。
- Pattern 用来存储所使用的正则表达式
- Matcher 用来对目标字符串执行正则表达式的匹配
例如,我们有一个字符串:
“In winter the nights are long and cold.”
现在我们想要匹配”long and cold”:
String testString = "In winter the nights are long and cold.";
Pattern testPattern = Pattern.compile("long and cold");
Matcher testMatcher = testPattern.matcher(testString);
Pattern的compile方法将我们的正则表达式编译成了一个“Pattern”,然后我们使用Pattern的matcher方法,并返回一个Matcher对象。
接下来,我们要通过Matcher的一系列方法,来从中提取出我们想要的字符串。
首先使用find()方法,可以在字符串中查找匹配正则,当有匹配到的字符串时,它会返回true:
testMatcher.find()
我们需要根据返回值,通过Matcher的group方法,来提取出匹配到的组(如果没有find到任何串,调用group也是没有意义的):
if (testMatcher.find()){
System.out.println(testMatcher.group(0));
}
程序输出:
long and cold
在这里,group(0)实际和直接调用group()(无参数)是一样的。
在Java中,通过正则直接匹配到的组,标号就是0。
标号非0的组,是使用正则捕获的组。这是正则表达式中的一个使用方法:
当我们在表达式中添加括号,则其中的部分被捕获并分组。
整个正则表达式匹配到的分组是0,
第一个括号捕获的分组是1,
第二个括号捕获的分组是2,……
例如我们想匹配”long and cold”这一短语,并从中提取出”long”和”cold”两个单词。那么我们的正则表达式需要写成
(long) and (cold)
find()方法调用前的代码完全相同,匹配到串以后,通过组号获得结果:
if (testMatcher.find()) {
System.out.println(testMatcher.group(0));
System.out.println(testMatcher.group(1));
System.out.println(testMatcher.group(2));
}
这次程序的输出是:
long and cold
long
cold