深入入门正则表达式(java) - 1 - 入门基础(二)
likely和一个空格,“\1”不会匹配“([a-zA-Z]+)”,因为之前括号的结果不是like,所以这次查找失败,无结果。
反向引用中的数字的确定
例如“((\d)(\d))\d”来匹配123这个数字。那么“\1”的结果是遇见的第一个括号,就是最外面的,“\1”结果为12。按着顺序“\2”结果为1,“\3”结果为2
最后再说下“()” ,反向引用 的开始已经说出了括号的另一个作用,那就是保存捕获的内容,这种类型的括号叫做捕获型括号 ,相对应的就有非捕获型括号“( :)”
“( :)” :非捕获型括号。“( :hate)”会匹配到hate这个字符串,但是如果你企图使用反向引用“( :hate) \1”,那么就会出现错误。这样的操作是非法的。
注意:非捕获型括号不影响捕获计数 ,获取“(( :\d)(\d))”中的“(\d)”捕获的内容为\2,不再是\3
好处:
1.提高效率,很容易理解,不记住捕获的内容也就不占用内存了
2.结构清晰
常用空白字符
“\s” :表示所有空白字符。
“\t” :制表符。
“\n” :换行符。
“\r” :回车。
一些其他常用的缩略表示
“\S” :除“\s”之外的任何字符
“ \ w” :等同于[a-zA-Z0-9_]
“ \W ” :除“\w”之外的任何字符
“ \ d” :等同于[0-9]
“ \ D” :除“d”之外的任何字符
有些工具不支持,比如EditPlus v3.10 中的查找就不支持\d等。
环视(零宽断言)
环视分为顺序和逆序,肯定和否定,组合一下一共4种。下面就看看环视到底是什么
“( =)” :顺序肯定环视:(从左至右)查看文本,如果能够匹配,就返回匹配成功信息。
“( <=)” :逆序肯定环视:(从右至左)查看文本,如果能够匹配,就返回匹配成功信息。
“( !)” :顺序否定环视:(从左至右)查看文本,如果不能够匹配,就返回匹配成功信息。
“(
下面看几个简单的实例,然后就很容易明白上面的火星语了
例:下面有两句话,加入你只想找到book,不想找到books
there is a book on the desk.
there are some books on the desk.
最简单的办法是:“book\b”,这很容易理解,book后面跟着单词分隔符,book后面如果是s,那么肯定被认为是一个单词,所以这样不会匹配到books。如果用环视,应该如何书写呢
“book( !\w)”
正则中的book很好理解,依次匹配b、o、o、k,然后呢,\w在上面说过等同于[a-zA-Z0-9],“( !\w)”是说:我要找这样一个位置,这个位置的后面不能是\w。
第一句话中,在匹配了book后,发现紧跟的是一个空格,恩,不是\w中的内容,匹配成功。
注意:环视不会占用字符!环视查找的是字符与字符之间的位置。
环视括号并没有捕获字符的功效,所以不能使用反向引用。
上图画三角号的位置就是这个环视匹配的位置
如果想匹配books的book怎么办,很简单“book( =s)”

上面演示了肯定顺序环视和否定顺序环视。下面演示了环视不占用字符。
比较容易理解吧,这个例子没有任何实际意义,仅做演示用
之后会给出一些有意义的例子
2.正则模式与匹配模式
此部分内容基本来自《精通正则表达式》 v3
1.忽略大小写模式: (java中使用Pattern.CASE_INSENSITIVE)
2.宽松排列与注释模式: 此模式会忽略字符组外部的所有空白字符 ,但是在java.util.regex中,字符组之外的所有空白字符并非都被忽略,而是作为一个“无意义字符(do-nothing metacharacter)” 。正则“\12 3”表“3”在“\12”之后,而非表示“\123”(java中使用Pattern.COMMENTS)
ps:“空白字符”的定义取决于所采用的字符编码的定义,以及此编码对空白字符的支持程度。大多数程序只能识别ASCII的空白字符。
3.点号通配模式(单行模式): (dot-match-all match mode)通常点号是不能匹配换行符的。 但是在java中情况特殊:在sun的正则表达式包,点号能够匹配未使用此模式时点号不能匹配的所有单字符Unicode行终止符。 (java中使用Pattern.DOTALL )
符:Unicode行终止符
字符
描述
LF
U+000A
VT
U+000B
FF
U+000C
CR
U+000D
CR/LF
U+000D U+000A
NEL
U+0085
LS
U+2028
PS
U+2029
ASCII 换行符
ASCII 垂直制表符
ASCII 进纸符
ASCII 回车
ASCII 回车/换行
Unicode 换行
Unicode 行分隔符
Unicode 段分隔符
4.增强的锚点模式(多行文本模式): (Enhanced line-anchor match mode)此模式影响“^”和“$”的匹配。 通常情况下“^”不能匹配字符串内部的换行符,而只能匹配目标字符串的起始位置。在此增强模式下,它能够匹配字符串中内嵌的文本行的开头位置。“$”也是这样,此模式下可以匹配字符串内部的换行符。这里可能不是很好理解,之后的实例会介绍,其中还包括“\A”,“\Z” 和“\z” 的意义(java中使用Pattern.CASE_INSENSITIVE)
5.文字文本模式: 此模式几乎不能识别任何元字符 。比如此模式下正则“[a-z]+” 匹配的就是字符串“[a-z]+”而并不是连续的小写英文字母(java中使用Pattern.CASE_INSENSITIVE)
上面的几种模式如果没有理解,可以看之后的教程。
将会在基本实例和高级基础中讨论。