温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Perl正则表达式中字符与字符集有哪些

发布时间:2021-12-06 14:09:36 来源:亿速云 阅读:273 作者:小新 栏目:大数据

这篇文章将为大家详细讲解有关Perl正则表达式中字符与字符集有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

⑴元字符

正则表达式语言由两种基本字符类型组成:原义文本字符和元字符(  metacharacter  )。原义文本字符也即要匹配的实际文本字符或者空格,而元字符是一个或一组代替一个或多个字符的字符,可以用来进行模糊匹配。常用的元字符及其表达式的含义如下表所示:

Perl正则表达式中字符与字符集有哪些

元字符的元(meta)实际上是通配的意思(但与linux的通配符不是一个体系)。在Perl中,反斜杠\就是一个特殊的元字符,要想匹配元字符本身(而不是他在正则表达式里面的含义),可以在相应的元字符之前加反斜杠,例如'\.'、'\*'、'\\'就分别匹配文本中的'.'、'*'、'\'。此外元字符^匹配行首,在集合字符[]内部表示补集,元字符$则匹配行尾。

⑵模式分组与捕获

在  Perl  的正则表达式中,圆括号  ()  也是一个特殊的元字符,用来对字符串进行分组,很多元字符只对单个字符进行操作,进行分组后可对多个字符进行操作,如下所示:
fred+    #可匹配freddddd…(fred)+    #可匹配fredfredfred…
圆括号内也即模式组内的字符串也可以被反向引用来进行操作,被引用的模式组也被称为捕获组(  capture group  ),引用方法为反斜杠加捕获组顺序编号,如下所示:
(.)\1        #匹配一个任意字符并重复一次,也即匹配两个连续的相同字符y(….) d\1      #匹配y开头后面四个任意字符,d开头也是相同这样字符的两个单词,例如yabba dabbay(.)(.)\2\1      #匹配y开头后面两个任意字符,然后接下来是这两个字符的倒序的单词,这是匹配类似yabba的这种回文结构y((.)(.)\3\2) d\1    #嵌套结构的反向引用,这里匹配y开头和d开头具有四个字符回文结构的单词组,例如yabba dabba
对于复杂嵌套结构的捕获组编号,  Perl  有个很简单的规则,只需根据从左到右左圆括号的顺序即可。如果反向引用捕获组编号后面紧跟着数字,为了消歧义可能需要更多的圆括号,而从  Perl 5.10  开始,反向引用可以使用  \g{n}  的格式,如下所示:  
(.)\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正则表达式中字符与字符集有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI