这篇文章将为大家详细讲解有关Perl正则表达式中字符与字符集有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
⑴元字符
元字符的元(meta)实际上是通配的意思(但与linux的通配符不是一个体系)。在Perl中,反斜杠\就是一个特殊的元字符,要想匹配元字符本身(而不是他在正则表达式里面的含义),可以在相应的元字符之前加反斜杠,例如'\.'、'\*'、'\\'就分别匹配文本中的'.'、'*'、'\'。此外元字符^匹配行首,在集合字符[]内部表示补集,元字符$则匹配行尾。
⑵模式分组与捕获
fred+ #可匹配freddddd…(fred)+ #可匹配fredfredfred…
(.)\1 #匹配一个任意字符并重复一次,也即匹配两个连续的相同字符y(….) d\1 #匹配y开头后面四个任意字符,d开头也是相同这样字符的两个单词,例如yabba dabbay(.)(.)\2\1 #匹配y开头后面两个任意字符,然后接下来是这两个字符的倒序的单词,这是匹配类似yabba的这种回文结构y((.)(.)\3\2) d\1 #嵌套结构的反向引用,这里匹配y开头和d开头具有四个字符回文结构的单词组,例如yabba dabba
(.)\g{1}11 #匹配类似于aa11这样的字符
在这种格式写法下,还可以使用相对位置进行编号:
(.)(.)\g{-1}11 #匹配类似于xaa11这样的字符
相对反向引用使用负号来指左边的捕获组,-1则为在左边最靠近引用位置的捕获组,这种写法避免了在另外加入括号之后所有编号都必须修改的窘况,更有利于程序维护。
y(?:(.)(.)\2\1) d(?:(.)(.)\4\3) #外层括号只起到模式分组作用,可以匹配类似yabba deffe结构的词组
⑶字符集
字符集(character class)是指一组可能出现的字符,通过写在方括号[]内的表达式进行表示,字符集可以匹配包含在集合内的单个字符。例如[abcxyz]可以匹配出现在字符串中的a、b、c、x、y、z中的任一个,相连的字符中间可以使用连字符-表示范围,例如上式可以写为[a-cx-z],如果在集合内包含连字符本身(而不是表示范围的含义)则可以使用反斜杠转义。对于ASCII字符可以使用反斜杠加八进制数字编码进行表示,例如[\000-\177]会匹配全部127个ASCII字符。在集合中开头添加脱字符^可以取补集,例如[^0-9]会匹配除数字以外的字符。对于Unicode字符集,除了可以像\x{2668}通过编码进行匹配外,还可以通过Unicode属性,例如很多字符属于空白符Space、数字Digit等,那么匹配的表达式则为\p{Space}和\p{Digit}。
字符集的出现是为了简写正则表达式,字符集也可以缩写例如\d可以代表[0-9],\w可以代表[a-zA-Z0-9_]。但在Perl从ASCII时代迈向Unicode时代之后,字符集的缩写更加宽泛,\d除了可以匹配普通数字,还可以匹配其他语言里的各种数字写法。从Perl 5.14开始,可以在正则表达式界定符后面添加修饰符a(关于界定符和修饰符详见下一小节),则正则表达式严格按照ASCII编码进行匹配,例如/\d/a则等同于/[0-9]/。字符集缩写将小写字母改为大写字母即变为补集,例如ASCII编码下\D可以代表[^0-9],此外很有意思的是[\d\D]将会匹配任何字符且包括换行符,这比'.'所包含的范围更广。
⑷元字符优先级
和操作符或者函数一样,正则表达式的元字符也存在优先级问题。元字符优先级规则如下所示:
①在此优先级表的最顶端是括号(),在模式分组和反向引用的时候使用,括号内部的任何部分比括号外的部分结合更紧密;
②第二级是数量词即星号(*), 加号(+),问号(?)以及由花括号表示的数量词,如{5,15}、{3, }、{5}等,它们通常和前一项元素紧密结合;
③第三级的是锚定和序列(sequence),锚定包括开头^、结尾$、词界符\b、非词界符\B,序列(一个元素紧接着一个元素)实际上是一种操作,虽然它没有使用元字符;
关于“Perl正则表达式中字符与字符集有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。