Python/PHP/JavaScript 中是否有正则表达式的实现支持可变长度的lookbehind-assertion?
/(?<!foo.*)bar/
如何编写具有相同含义但不使用后向断言的正则表达式?
这种类型的断言是否有可能在某一天实现?
事情比我想象的要好得多。
更新:
(1) 已经有支持变长lookbehind-assertion的正则表达式实现。
Python 模块正则表达式(不是标准re
的,而是附加regex
模块)支持这样的断言(并具有许多其他很酷的特性)。
>>> import regex
>>> m = regex.search('(?<!foo.*)bar', 'f00bar')
>>> print m.group()
bar
>>> m = regex.search('(?<!foo.*)bar', 'foobar')
>>> print m
None
正则表达式中有一些东西是 Perl 做不到而 Python 可以做到的,这对我来说是一个非常大的惊喜。也许,Perl 也有“增强的正则表达式”实现?
(感谢并 +1 给 MRAB)。
(2) 现代正则表达式有一个很酷的特性\K
。
这个符号意味着当你进行替换时(从我的角度来看,断言最有趣的用例是替换),之前找到的所有字符都\K
不能更改。
s/unchanged-part\Kchanged-part/new-part/x
这几乎就像一个后视断言,但当然不是那么灵活。
更多关于\K
:
据我了解,您不能在同一个正则表达式中使用 \K 两次。而且你不能说你想“杀死”你找到的角色。那总是直到行的开头。
(感谢并 +1 ikegami)。
我的其他问题:
- 有没有可能说哪一点一定是最终的
\K
效果点? - Perl/Ruby/JavaScript/PHP 的增强正则表达式实现怎么样?类似于
regex
Python 的东西。