在正则表达式中,有一些特殊的字符,例如‘* ?’等,他们有特殊的意义,‘*’代表出现0至多次,‘?’代表1次或0次,称他们为元字符。
行起始和结束字符
^ 匹配行的起始
$ 匹配行的结束
例如,在http://regexr.com/中:
这里只匹配了倒数两行中的http,但倒数第三行中的http并没有匹配到,这就是元字符“^”起到的作用,注意:确保你在匹配的时候点选了flags中的multiline,不然这些文本默认为一行,即只有第一行开头有行起始符。行结束符类似。
字符组
[] 字符组,字符组里面的字符只能出现一个,即其中的字符是或的意思。
例如:
当需要表示某些连续的数字或字母时,可以用‘-’连字符来连接
[1-6] 表示123456
[a-c] 表示abc
要注意,连字符‘-’一定要出现在字符组中且出现在中间才能表示范围,当出现在‘[’之后又或‘]’之前时,它只是表示一般的字符。
[-13] 匹配'-'或'1'或'3'
当然,也可以字符组中没有出现的字符,即排除型字符组
[^ ] 排除型字符组
匹配任意字符
. 匹配任意字符
需要注意的是,当‘.’在字符组内是匹配的就是字符‘.’而不是任意字符,在字符组外,当想要匹配字符‘.’时,可以使用‘.’来匹配,如下:
其他的元字符如果想匹配它本身,都可以用‘\’来转义。
多选结构
| 代表或
字符组中的字符也是代表或,但它只能匹配文本中的单个字符,而多选结构可以匹配任意长度的字符
注意,表示或的那部分要用()括起来,不然就成了匹配‘twen’或‘hirty’了
单词分界符
\< 匹配单词的开头
\> 匹配单词的结尾
书上说的是有的egrep版本中有的是这两个元字符,但在http://regexr.com/ 上支持的是这个
\b 匹配单词的边界
我试了一下,我的egrep这两个都支持。
可以看到,Welcome中的come并没有匹配。
量词
? 之前紧邻的元素出现0次或1次
+ 之前紧邻的元素出现1次到多次
* 之前紧邻的元素出现0次到多次
例如我前面的关于拉丁猪文字游戏的例子:
String regex = "([aeiou]*)([^eaiou])(.*)";
第一个‘*’匹配任意多个元音字母,第二个匹配任意多个任意字符,括号是分组用的,与量词无关。
当然,也可以自己规定出现多少次:
{min,max}
例如:
一些常用的元字符
下面列举了一些常用的元字符,基本在所有支持正则表达式的语言和工具中都是通用的。
\d [0-9]
\D 除了‘\d’之外的所有字符
\w [a-zA-Z0-9]
\W 除了‘\w’之外的所有字符
\s 所有的“空白“”字符,例如空格符,制表符,进纸符
\S 除了‘\s’之外的所有字符
反向引用
先举例子,如果想要匹配叠词,及AABB的形式,用前面的量词即可以解决
.{2}.{2}
但是如果要匹配 AACAA 这些类似的的文本是该怎么匹配呢?
这里的‘\1’就是代表第一组的意思,括号能记忆其中的子表达式匹配的文本,不论这些文本是什么,元字符序列‘\1’都能记住它,当然,第二组就是‘\2’了。注意,用括号括起来才能成为组。