正则表达式中的变长lookbehind断言
正则表达式提供了强大的模式匹配能力,但是变长lookbehind断言的实现长期以来一直是争论的话题。
Lookbehind 断言的实现
目前,Python 中的 regex 模块支持可变长度 Lookbehind 断言。语法为 (?
<code class="python">>>> import regex >>> m = regex.search('(?<!foo.*)bar', 'f00bar') >>> print(m.group()) bar >>> m = regex.search('(?<!foo.*)bar', 'foobar') >>> print(m) None</code>
不带后向断言的替代方案
在没有lookbehind断言的情况下,有两种选择:
K(保留):此符号标记模式中的一个点,在该点之前在替换或分组之前,任何匹配的字符都会被丢弃。
s/(?<=foo.*)bar/moo/s;
变成:
s/foo.*\Kbar/moo/s;
负向前瞻: 此技术使用负数向前检查是否缺少“foo”。
s/(?<!foo.*)bar/moo/s;
变为:
s/^(?:(?!foo).)*\Kbar/moo/s;
未来实现
Perl 和 JavaScript 等主流语言中缺乏可变长度后向断言,这引发了对未来实现的疑问。有一天这些语言可能会采用类似于 Python 正则表达式的增强正则表达式模块。
替代方案的局限性
其他问题
以上是可变长度回顾断言:正则表达式的未来?的详细内容。更多信息请关注PHP中文网其他相关文章!