正则表达式高级用法

非捕获型括号"(?:…)"

"(…)“用于分组和捕获,提供反向引用;”(?:…)"表示只分组不捕获,不提供反向引用。

环视

环视结构不匹配任何字符,只匹配文本中的特定位置,即:环视不会“占用”字符。

类型正则式匹配成功的条件
肯定逆序环视(?<=…)子表达式能够匹配左侧文本(自右向左)
否定逆序环视(?<!..)子表达式不能匹配左侧文本(自右向左)
肯定顺序环视(?=…)子表达式能够匹配右侧文本(自左向右)
否定顺序环视(?!..)子表达式不能匹配右侧文本(自左向右)

区分基本正则式与扩展正则式

正则式特性BREsEREs
+和?量词不支持支持
区间量词\{min,max\}{min,max}
分组\(…\)(…)
反向引用\1到\9
多选结构不支持支持

模式修饰符"(?modifier)"

设定匹配模式,如:i,不区分大小写。

模式作用范围"(?modifier:…)"

限制所设定的匹配模块范围。

注释"(?#…)“或”#"

(?#…)常用于不支持宽松排列的情况。

固化分组"(?>…)"

通过固化分组匹配到的内容,它永远不会“交还”已经匹配的任何内容。即使后续匹配失败。

忽略优先量词"*?“、”+?“、”??“、”{min,max}?"

匹配尽可能少的内容,只需要满足下限,匹配就能成功。相当于是反贪婪匹配模式。

占有优先量词"*+“、”++“、”?+“、”{min,max}+"

匹配内容上遵从贪婪匹配,但匹配成功后不会“交还”已经匹配的任何内容。类似于贪婪匹配和固化分组的结合。

正则匹配引擎

NFA:表达式主导
DFA:文本主导
NFA与DFA匹配最直观的差异在于处理多选结构的区别,NFA将多选结构作为独立的正则式处理,相当于线性匹配方式,DFA将多选结构潜在的可能做并行处理,相当于并行匹配方式。
NFA匹配速度与正则式相关,DFA匹配速度与正则式无关,对于复杂的正则式如果使用NFA引擎匹配,要做好正则式优化工作,否则可能长时间甚至不能成功匹配。
NFA在能力上较DFA具有一定优势,如:反向引用,环视,占有优先量词,固化分组。
现在许多工具已经糅合了NFA和DFA。

正则式性能优化

  • 将匹配权重高的表达式放到左侧,优先执行,主要是提高准确度和效率。如:具有一票否定权的。这一点类似于提高C/C++分支结构执行效率。
  • 限制匹配优先的作用范围,用量词限制。
  • 能够使用[…]解决就不使用多选结构,减少匹配过程中的回溯次数。
  • 避免出现指数级正则式匹配,单个量词“迭代”次数不应该比目标字符串的字符数量更多。
  • 避免重新编译。
  • 使用非捕获型括号,如果不需要反向引用。
  • 不要滥用括号。
  • 不要滥用字符组。
  • 使用起始锚点。
  • 尽可能的将文字文本独立出来。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值