正则表达式:高效匹配与优化技巧
1. 占有型量词与原子分组
在正则表达式中,占有型量词 !(˙˙˙;˙˙˙)++ 在匹配完成后不会留下任何状态。而原子分组 !(?>˙˙˙;˙˙˙)+ 只是消除每个可选分支以及分支选择本身留下的状态。由于星号在原子分组之外,它不受原子分组的影响,仍然会留下所有 “可以尝试跳过此次匹配” 的状态,这意味着单个匹配仍可通过回溯撤销。为了消除外部量词的状态,我们需要在外层再添加一组原子分组,所以需要使用 !(?>(˙˙˙;˙˙˙)+) 来模拟占有型量词 !(˙˙˙;˙˙˙)++ 。
虽然 !(˙˙˙;˙˙˙)++ 和 !(?>˙˙˙;˙˙˙)+ 都有助于解决无限匹配的问题,但它们丢弃状态的时机和方式有所不同。
2. 展开正则表达式的示例
2.1 展开 “多字符” 引号匹配
原始的匹配示例如下:
<B>
# Match the opening <B>
(
# Now, as many of the following as possible . . .
(?! < /? B> )
# If not <B>, and not </B> . . .
.
# . . . any character is okay
)+
# (now greedy)
</B>
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



