java学习之正则表达式

声明:此内容参考书籍《疯狂java讲义第二版》

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,String类里也提供了如下几个特殊的方法:
(1)boolean matcher(String regex):判断该字符串是否匹配指定的正则表达式
(2)String replaceAll(String regex,String replacement):将该字符串中所有匹配regex的字串替换成replacement。
(3)String replaceFirst(String regex,String replacement):将该字符串中第一个匹配regex的字串替换成replacement。
(4)String [] split(String regex):已regex作为分隔符,把该字符串分割成多个字串。
上面几种特殊方法都依赖于java提供的正则表达式支持,除此之外,java还提供了Pattern和Matcher两个类专门用于提供正则表达式支持。

创建正则表达式

正则表达式其实就是一个用于匹配字符串的模版,可以匹配一批字符串,所以创建正则表达式就是创建一个特殊的字符串,正则表达式所支持的合法字符如下:
java学习之正则表达式_第1张图片
除此之外,正则表达式中有一些特殊字符,这些特殊字符在正则表达式中有特殊的含义,比如前面提到的反斜杠\,如果需要匹配这些特殊字符,则必须对这些字符进行转义,也就是在前面加一个反斜杠
java学习之正则表达式_第2张图片

"\\u0041\\"   匹配a\
"\\0101\t"   匹配a<制表符>
"\\?\["   匹配?[

上面的正则表达式只能匹配单个字符,这是因为还未在正则表达式中使用“通配符”,“通配符”是可以匹配多个字符的特殊字符。“通配符”成为预定义字段,如下:java学习之正则表达式_第3张图片
有个预定义字符后,就可以创建更强大的正则表达式:

c\wt    匹配cat、cbt、c9t等一批字符串
\d\d\d-\d\d\d-\d\d\d 匹配000-000-000形式的电话号码

在一些特殊情况下,例如:只想匹配0-f的字符,或者匹配除ab以外的所以小写字母,或者匹配中文字符,上面这些预定义字符就无能为力了,此时需要方括号表达式,如下:java学习之正则表达式_第4张图片
除此之外,还提供了边界匹配符java学习之正则表达式_第5张图片

java还提供了数量标识符,有如下几种模式:
(1)Greedy(贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。此模式会一直匹配下去,直到不能匹配为止。
(2)Reluctant(勉强模式):用问号后缀表示(?)它只会匹配最少的字符,也成为最小匹配模式。
(3)Possessive(占有模式):用加号后缀表示(+),目前只有java具有占有模式,通常比较少用。
java学习之正则表达式_第6张图片
image.png

使用正则表达式

Pattern是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。多个Matcher对象可以共享一个Pattern对象。

//将一个字符串编译成pattern对象
Pattern pattern = Pattern.compile("a*b");
//使用Pattern对象创建Matcher对象
Matcher m = p.matcher("aaaab");
boolean b= m.matches();//返回true

上面定义的Pattern对象可以多次重复使用,如果某个正则表达式仅需一次使用,则可直接使用Pattern类的静态matches方法,此方法自动把指定字符串编译成匿名的Pattern对象,并执行匹配:

boolean b = Pattern.matches(a*b,"aaab");//返回true

Matcher类提供了结果常用方法:
find():返回目标字符串中是否包含与Pattern匹配的字符串。
group():返回上一次与Pattern匹配的子串。
start():返回上一次与Pattern匹配的子串在目标字符串的开始位置。
end():返回上一次与Pattern匹配的子串在目标字符串的结束位置+1。
lookingAt():返回目标字符串前面部分与Pattern是否匹配。
matches():返回整个目标字符串与Pattern是否匹配。
reset():将现有的Matcher对象应用于一个新的字符序列。
java学习之正则表达式_第7张图片
从上边的运行结果可以看出,find()方法还可以传入一个int类型的参数,带int类型的参数的find()方法从该int索引处向下搜索。
java学习之正则表达式_第8张图片
从上边的运行结果可以看出,start(),end()返回子串在目标字符串的位置。
matcher()和lookingAt()方法有点相似,但是matcher要求整个字符串和Pattern匹配才返回true,而lookingAt()只要字符串以Pattern开头就返回true。reset()可将现有的Matcher应用于新的字符序列。
java学习之正则表达式_第9张图片

你可能感兴趣的:(java)