7.5.2 使用正则表达式
一旦在程序中定义了正则表达式,就可以使用Pattern
和Matcher
来使用正则表达式。Pattern
对象是正则表达式编译后在内存中的表示形式,因此,
- 正则表达式字符串必须先被编译为
Pattern
对象, - 然后再利用该
Pattern
对象创建对应的Matcher
对象。
执行匹配所涉及的状态保留在Matcher
对象中,多个Matcher
对象可共享同一个Pattern
对象。
因此,典型的调用顺序如下:
1 | //将一个字符串编译成Pattern对象 |
定义好的的Pattern
对象可以多次重复使用。
直接使用Pattern类的静态matches方法
如果某个正则表达式仅需一次使用,则可直接使用Pattern
类的静态matches
方法,此方法自动把指定字符串编译成匿名的Pattern
对象,并执行匹配。
1 | boolean b= Pattern matches("a*b","aaaaab");//true |
采用这种语句每次都需要重新编译新的Pattern
对象,不能重复利用已编译的Pattern
对象,所以效率不高.
Pattern类线程安全
Pattern
是不可变类,可供多个并发线程安全使用。
Matcher类常用方法
方法 | 描述 |
---|---|
find() |
返回目标字符串中是否包含与Pattern 匹配的子串。 |
group() |
返回上一次与Pattern 匹配的子串。 |
start() |
返回上一次与Pattern 匹配的子串在目标字符串中的开始位置。 |
end() |
返回上一次与Pattern 匹配的子串在目标字符串中的结束位置加1。 |
lookingAt() |
返回目标字符串前面部分与Pattern 是否匹配。 |
matches() |
返回整个目标字符串与Pattern 是否匹配。 |
reset() |
将现有的Matcher 对象应用于一个新的字符序列。 |
CharSequence接口
在Pattern
、 Matcher
类的介绍中经常会看到一个CharSequence
接口,该接口代表一个字符序列,其中CharBuffer
、 String
、 StringBuffer
、 StringBuilder
都是它的实现类。简单地说, CharSequence
代表一个各种表示形式的字符串。
通过Matcher
类的find()
和group()
方法可以从目标字符串中依次取出特定子串,例如互联网的网络爬虫,它们可以自动从网页中识别出所有的电话号码。
实例
下面程序示范了如何从大段的字符串中找出电话号码。
1 | import java.util.regex.*; |
运行结果:
1 | 13500006666 |
find方法
find()
方法依次查找字符串中与Pattern
匹配的子串,一旦找到对应的子串,下次调用find()
方法时将接着向下查找。find()
方法还可以传入一个int
类型的参数,带int
参数的find()
方法将从该int
索引处向下搜索.
开发一个简单网络爬虫的思路
使用正则表达式可以提取网页上的电话号码,也可以提取邮件地址等信息。如果程序再进一步,可以从网页上提取超链接信息,再根据超链接打开其他网页,然后在其他网页上重复这个过程就可以实现简单的网络爬虫了。
start()
和end()
方法主要用于确定子串在目标字符串中的位置.
matches和lookingAt方法的区别
matches()
和lookingAt()
方法有点相似,只是:
matches
方法要求整个字符串和Pattern
完全匹配时才返回true
,- 而
lookingAt()
只要字符串以Pattern
开头就会返回true
。
reset方法
reset()
方法可将现有的Matcher
对象应用于新的字符序列.
1 | import java.util.regex.*; |
从某个角度来看, Matcher
的matches()
、 lookingAt()
和String
类的equals()
、 startsWith()
有点相似。区别是
String
类的equals()
和startsWith()
都是与字符串进行比较,- 而
Matcher
的matches
和lookingAt()
则是与正则表达式进行匹配。
String
类里也提供了matches
方法,该方法返回该字符串是否匹配指定的正则表达式.
还可以利用正则表达式对目标字符串进行分割
、査找
、替换
等操作.
原文链接: 7.5.2 使用正则表达式