加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式进阶

发布时间:2020-12-13 23:11:26 所属栏目:百科 来源:网络整理
导读:捕获匹配结果,并为之命名 以下示例表示匹配日期表示中的年月日,并给他们命名。 giNamed capture b(?yeardddd)-(?monthdd)-(?daydd)b Regex options:None Regex flavors:.NET,PCRE 7,Perl 5.10,Ruby 1.9 b(?'year'dddd)-(?'month'dd)-(?'d
捕获匹配结果,并为之命名
以下示例表示匹配日期表示中的年月日,并给他们命名。

giNamed capture
b(?<year>dddd)-(?<month>dd)-(?<day>dd)b
Regex options:None
Regex flavors:.NET,PCRE 7,Perl 5.10,Ruby 1.9
b(?'year'dddd)-(?'month'dd)-(?'day'dd)b
Regex options:None
Regex flavors:.NET,Ruby 1.9
b(?P<year>dddd)-(?P<month>dd)-(?P<day>dd)b
Regex options:None
Regex flavors:PCRE 4 and later,Python


以下示例是匹配日期,并要求年份的后两位、月份、日子这三个数字要是一样的。目标字符串【2012-12-12】【2008-08-08】

Named backreferences
bdd(?<magic>dd)-k<magic>-k<magic>b
Regex options:None
Regex flavors:.NET,Ruby 1.9
bdd(?'magic'dd)-k'magic'-k'magic'b
Regex options:None
Regex flavors:.NET,Ruby 1.9

bdd(?P<magic>dd)-(?P=magic)-(?P=magic)b
Regex options:None
Regex flavors:PCRE 4 and later,Python




匹配字符串次数设置

  • 匹配一个数字100次,正则表达式:【bd{100}b】
  • 匹配一个32-bit的十六进制数字,正则表达式:【b[a-f]{1,8}b】
  • 匹配一个可能带有字母"h"的十六进制数字,正则表达式:【b[a-f0-9]{1,8}h?】
解释:
  • 【{n}】表示匹配前面的字符n次
  • 【{n,m}】m大于n,表示匹配前面的字符n次~m次
  • 【h?】等价于【h{0,1}】,表示h不出现,或者出现一次。
  • 【{n,}】表示匹配前缀的字符可以出现n次到无穷次。
  • 【d{1,}】等价于【d+】,表示数字出现1到无穷次。
  • 【d{0,}】等价于【d*】,表示数字出现0到无穷次。


惰性匹配
前面介绍都是贪心匹配,比如【d{3,10}】表达式会贪心匹配数字字符。
惰性匹配是指尽量少匹配,惰性匹配的方法就是在表达式后面加上【?】,比如表达式【d{3,10}?】等价于【d{3}】.
惰性匹配的典型应用是在html/XML代码解析过程中,比如要从<p>test1</p><p>test2</p>字符串中找到第一个p标签的内容。最容易想到的表达式就是【<p>.*</p>】,但是其实这是个贪心匹配,会匹配第一个<p>到最后一个</p>之间的内容。对应的惰性匹配表达式就是【<p>.*?</p>】,将会匹配第一个<p>与第一个</p>之间的内容。


减少不必要的回溯
这部分将介绍两个名词:占有量词(possessive quantifier)、原子组(atomic group).
假如我们利用贪心量词表达式【bd+b】去匹配目标字符串【1234X】,
  • 【bd++】首先会匹配到【1234】,最后一个【b】匹配失败;
  • 再将【bd++】回溯匹配到【123】,最后一个【b】又匹配失败;
  • 再将【bd++】回溯匹配到【12】,最后一个【b】又匹配失败;
  • 最后【bd++】回溯匹配到【1】,最后一个【b】有匹配失败,最终失败返回。
从以上步骤我们可以看出,贪心匹配又有一个明显的性能缺陷就是它会不断的回溯直至失败。如果目标字符串很长,它就很耗时。
针对贪心匹配的缺陷,有两种解决方法:占有量词、原子组。
占有量词与贪心匹配相似,它会尽量匹配更多的字符。不同点就是当匹配失败时,它不会回溯,它只会在剩余字符串查找匹配结果。
原子组的效果与占有量词是一样的。

下面介绍它们的表示方法。以表达式【d+】为例
  • 贪心匹配表达式:【d+】
  • 占有量词表达式是在贪心表达式加上【+】,形如【d++】,【*+】,【?+】
  • 原子组表达式形如【(?>regex)】,例如【(?>d+)】


减少不必要的回溯

形式:【(?(1)then|else)

解释:

如果group1的内容被匹配,则接下来匹配then部分。如果group1部分没有匹配就匹配else部分。

在此说明group的概念,一个正则表达式中,每一对括号包含的内容称为一个group,第一个括号的内容称为group1,第二个称为group2.

举例:【(a)b(?(1)c|d)】将会匹配abc或者bd

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读