Igo*_*bin 42 javascript php python regex perl
Python/PHP/JavaScript中是否有正则表达式的实现,它支持可变长度的lookbehind-assertion?
/(?<!foo.*)bar/
Run Code Online (Sandbox Code Playgroud)
如何编写具有相同含义的正则表达式,但不使用lookbehind-assertion?
是否有可能在某一天实施这种类型的断言?
我认为事情要好得多.
更新:
(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
Run Code Online (Sandbox Code Playgroud)
对我来说,真正意外的是,正则表达式中有些东西是Perl无法做到的,Python也可以.可能,Perl还有"增强的正则表达式"实现吗?
(谢谢和MRAB +1).
(2)\K现代正则表达式中有一个很酷的功能.
这个符号意味着当你进行替换时(从我的角度来看,最有趣的断言用例是替换),所以之前找到的所有字符\K都不能改变.
s/unchanged-part\Kchanged-part/new-part/x
Run Code Online (Sandbox Code Playgroud)
这几乎就像一个后视断言,但当然不是那么灵活.
更多关于\K:
据我所知,你不能在同一个正则表达式中使用\ K两次.而且你不能说你想要"杀死"你找到的角色.这总是直到线的开头.
(谢谢和池上+1).
我的其他问题:
\K?regexPython 这样的东西.ike*_*ami 41
大多数情况下,您可以通过使用避免可变长度的lookbehinds \K.
s/(?<=foo.*)bar/moo/s;
Run Code Online (Sandbox Code Playgroud)
将会
s/foo.*\Kbar/moo/s;
Run Code Online (Sandbox Code Playgroud)
消极的外观有点棘手.
s/(?<!foo.*)bar/moo/s;
Run Code Online (Sandbox Code Playgroud)
将会
s/^(?:(?!foo).)*\Kbar/moo/s;
Run Code Online (Sandbox Code Playgroud)
因为(?:(?!STRING).)*是STRING为[^CHAR]*是CHAR.
如果你只是匹配,你可能甚至不需要\K.
/foo.*bar/s
/^(?:(?!foo).)*bar/s
Run Code Online (Sandbox Code Playgroud)
MRA*_*RAB 10
对于Python,有一个正则表达式实现,它支持可变长度的lookbehinds:
http://pypi.python.org/pypi/regex
它旨在向后兼容标准re模块.
您可以反转字符串和模式并使用可变长度前瞻
(rab(?!\w*oof)\w*)
粗体匹配:
raboof rab7790oof raboo rabof rab rabo raboooof rabo
据我所知,原始解决方案是:
Jeff 'japhy' Pinyan