perl允许我们定义只在一定范围内生效的修饰符,方式是(?imsx:pattern)或(?-imsx:pattern)或(?imsx-imsx:pattern),其中加上-表示去除这个修饰符的影响。这里只列出了imsx,因为这几个最常用,其他的修饰符也一样有效。
例如,对于待匹配字符串"Hello world gaoxiaofang",使用以下几种模式去匹配的话:
/(?i:hello) world/
表示匹配hello时,可忽略大小写,但匹配world时仍然区分大小写。所以匹配成功
/(?ims:hello.)world/
表示可以跨行匹配helloworld,也可以匹配单行的hellosworld,且hello部分忽略大小写。所以匹配成功
/(?i:hello (?-i:world) gaoxiaoFANG)/
表示在第二个括号之前,可用忽略大小写进行匹配,但因为第二个括号里指明了去除i的影响,所以对world的匹配会区分大小写,但是对gaoxiaofang部分的匹配又不区分大小写。所以匹配成功
/(?i:hello (?-i:world) gaoxiao)FANG/
和前面的类似,但是将"FANG"放到了括号外,意味着这部分要区分大小写。所以匹配失败
1.锚定类的反斜线序列
所谓锚定,是指它匹配的是位置,而非字符,比如锚定行首的意思是匹配第一个字母前的空字符。也就是很多人说的"零宽断言(zero-width assertions)"。
\b:匹配单词边界处的空字符
\B:匹配非单词边界处的空字符
\<:匹配单词开头处的空字符
\>:匹配单词结尾处的空字
\A:匹配绝对行首,换句话说,就是输入内容的开头
\z:匹配绝对行尾,换句话说,就是输入内容的绝对尾部
\Z:匹配绝对行尾或绝对行尾换行符前的位置,换句话说,就是输入内容的尾部
\G:强制从位移指针处进行匹配,详细内容见
主要解释下\A \z \Z,其它的属于基础正则的内容,不多做解释了。
\A \z \Z和^ $的区别主要体现在多行模式下。在多行模式下:
从上面的$匹配示例可知,$代表的行尾,其实它在有换行符的时候匹配"\n",而不是"\n"的前、后,在没有换行符的时候,匹配行尾。
2.字符匹配反斜线序列
当然,除了以下这几种,还有\v \V \h \H \R \p \c \X,这些基本不会用上,所以都不会在本文解释。
\w:匹配单词构成部分,等价于[_[:alnum:]]
\W:匹配非单词构成部分,等价于[^_[:alnum:]]
\s:匹配空白字符,等价于[[:space:]]
\S:匹配非空白字符,等价于[^[:space:]]
\d:匹配数字,等价于[0-9]
\D:匹配非数字,等价于[^0-9]
\N:不匹配换行符,等价于[^\n]。但\N{NAME}有特殊意义,表示匹配已命名(名为NAME)的unicode字符序列,本文不介绍该特殊用法
由于元字符.默认无法匹配换行符,所以需要匹配换行符的时候,可以使用特殊组合[\d\D]或者(\n|\N)来替换.,换句话说,如果想匹配任意长度的任意字符,可以换成[\d\D]*或者(\n|\N)*,当然,前提是必须支持这3个反斜线序列。
之所以不用[\n\N]替代元字符.,是因为\N有特殊意义,不能随意接符号和字母。
3.分组引用的反斜线序列
\1:反向引用,其中1可以替换为任意一个正整数,即使超出9,例如\111表示匹配第111个分组
\g1或\g{1}:也是反向引用,只不过这种写法可以避免歧义,例如\g{1}11表示匹配第一个分组内容后两个数字1
\g{-1}:还可以使用负数,表示距离\g左边的分组号,也就是相对距离。例如(abc)([a-z])\g{-1}中的\g引用的是[a-z],如果-1换成-2,则引用的abc
\g{name}:引用已命名的分组(命名捕获),其中name为分组的名称
\k<name>:同上,引用已命名的分组(命名捕获),其中name为分组的名称
\K:不要将\K左边的内容放进$&。换句话说,\K左边的内容即使匹配成功了,也会重置匹配的位置