最近玩了玩微信公众号开发之后,想写一个爬虫为公众号爬一点数据;在测试过程中,需要获取页面的所有链接,比较快捷的办法是使用正则表达式直接匹配,那么Java中的字符串正则用的是Pattern和Matcher结合,功能还是蛮强大的;我平时工作中对这两个类接触的少,具体的使用这篇博文写的很详细,转载记录一下;
转载自:http://blog.csdn.net/cclovett/article/details/12448843/
结论:
Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.
单独用Pattern只能使用Pattern.matches(String regex,CharSequence input)一种最基础最简单的匹配。
java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(建议在阅读本文时,打开java API文档,当介绍到哪个方法时,查看java API中的方法说明,效果会更佳).
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式;
Java代码示例:
1 | Pattern p=Pattern.compile("\\w+"); |
1.Pattern.split(CharSequence input)
Pattern有一个split(CharSequence input)方法,用于分隔字符串,并返回一个String[],我猜String.split(String regex)就是通过Pattern.split(CharSequence input)来实现的.
Java代码示例:
1 | Pattern p=Pattern.compile("\\d+"); |
2.Pattern.matches(String regex,CharSequence input)
一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.
Java代码示例:
1 | Pattern.matches("\\d+","2223"); |
3.Pattern.matcher(CharSequence input)
说了这么多,终于轮到Matcher类登场了,Pattern.matcher(CharSequence input)返回一个Matcher对象.
Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例.
Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.
Java代码示例:
1 | Pattern p=Pattern.compile("\\d+"); |
4.Matcher.matches() / Matcher.lookingAt() / Matcher.find()
Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false
matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true
Java代码示例:
1 | Pattern p=Pattern.compile("\\d+"); |
我们现在回头看一下Pattern.matches(String regex,CharSequence input),它与下面这段代码等价 Pattern.compile(regex).matcher(input).matches()
lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
Java代码示例:
1 | Pattern p=Pattern.compile("\\d+"); |
find()对字符串进行匹配,匹配到的字符串可以在任何位置.
Java代码示例:
1 | Pattern p=Pattern.compile("\\d+"); |
5.Mathcer.start() / Matcher.end() / Matcher.group()
当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息.
start()返回匹配到的子字符串在字符串中的索引位置.end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.group()返回匹配到的子字符串
Java代码示例:
1 | Pattern p=Pattern.compile("\\d+"); |
说了这么多,相信大家都明白了以上几个方法的使用,该说说正则表达式的分组在java中是怎么使用的.
start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(int i)专用于分组操作,Mathcer类还有一个groupCount()用于返回有多少组.
Java代码示例:
1 | Pattern p=Pattern.compile("([a-z]+)(\\d+)"); |
现在我们使用一下稍微高级点的正则匹配操作,例如有一段文本,里面有很多数字,而且这些数字是分开的,我们现在要将文本中所有数字都取出来,利用java的正则操作是那么的简单.
Java代码示例:
1 | Pattern p=Pattern.compile("\\d+"); |
如将以上while()循环替换成
1 | while(m.find()) { |
现在大家应该知道,每次执行匹配操作后start(),end(),group()三个方法的值都会改变,改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息.
注意:只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.

