正则表达式中的贪婪、回溯与匹配规则详解
1. 原子分组与占有量词的差异
在正则表达式里, !(?> M )+ 和 !(?> M+ ) 存在显著区别。 !(?> M )+ 会丢弃由 !M 创建的未使用状态,不过由于 !M 本身不会创建状态,所以这一操作意义不大。而 !(?> M+ ) 会丢弃由 !M+ 创建的未使用状态,这在实际应用中可能非常有用。
当把复杂的占有量词表达式,如 !(\\";[ˆ"])+ 转换为原子分组时,不能简单地在现有括号中添加 ?> 变成 !(?>\\";[ˆ"])+ 。这种新表达式或许能达成目标,但它与原始的占有量词版本并不等效,就如同把 !M++ 变成 !(?>M)+ 一样。若要实现等效转换,应先移除占有加号,再将剩余部分用原子分组包裹,即 !(?>(\\";[ˆ"])+) 。
2. 环视结构的回溯机制
环视结构(包括前瞻和后顾的肯定与否定形式)与原子分组和占有量词密切相关。它的作用是测试子表达式能否从当前位置开始(前瞻)或结束(后顾)匹配。
在 NFA 环境中,环视结构的子表达式在测试时就像处于一个独立的小世界。它会按需保存状态并在必要时回溯。若子表达式成功匹配,对于肯定环视,整个
超级会员免费看
订阅专栏 解锁全文
986

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



