Perl正则表达式超详细教程(7)

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"放到了括号外,意味着这部分要区分大小写。所以匹配失败

perl支持的反斜线序列

1.锚定类的反斜线序列

所谓锚定,是指它匹配的是位置,而非字符,比如锚定行首的意思是匹配第一个字母前的空字符。也就是很多人说的"零宽断言(zero-width assertions)"。

\b:匹配单词边界处的空字符

\B:匹配非单词边界处的空字符

\<:匹配单词开头处的空字符

\>:匹配单词结尾处的空字

\A:匹配绝对行首,换句话说,就是输入内容的开头

\z:匹配绝对行尾,换句话说,就是输入内容的绝对尾部

\Z:匹配绝对行尾或绝对行尾换行符前的位置,换句话说,就是输入内容的尾部

\G:强制从位移指针处进行匹配,详细内容见

主要解释下\A \z \Z,其它的属于基础正则的内容,不多做解释了。

\A \z \Z和^ $的区别主要体现在多行模式下。在多行模式下:

Perl正则表达式超详细教程

$txt = "abcd\nABCD\n"; $txt1 = "abcd\nABCD"; $txt =~ /^ABC*/; # 无法匹配 $txt =~ /^ABC*/m; # 匹配 $txt =~ /\Aabc/; # 匹配 $txt =~ /\Aabc/m; # 匹配 $txt =~ /\AABC/m; # 无法匹配 $txt =~ /cd\n$/m; # 不匹配 $txt =~ /cd$\n/m; # 不匹配 $txt =~ /cd$/m; # 匹配 $txt =~ /CD\Z\n/m # 匹配 $txt =~ /CD\Z\n\Z/m; # 匹配 $txt =~ /CD\n\z/m; # 匹配 $txt1 =~ /CD\Z/m; # 匹配 $txt1 =~ /CD\z/m; # 匹配

从上面的$匹配示例可知,$代表的行尾,其实它在有换行符的时候匹配"\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左边的内容即使匹配成功了,也会重置匹配的位置

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e1a716f6fc1f35a6ad219d4af05ea1f5.html