正则表达式的可变长度lookbehind-assertion替代方案

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
  • 如何为Perl/Ruby/JavaScript/PHP增强正则表达式实现?像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)

  • 非常感谢,非常感谢.但请添加一个关于`\ K`实际上是什么的说明.这对谷歌来说并不容易. (8认同)

MRA*_*RAB 10

对于Python,有一个正则表达式实现,它支持可变长度的lookbehinds:

http://pypi.python.org/pypi/regex

它旨在向后兼容标准re模块.


Ben*_*ate 5

您可以反转字符串和模式并使用可变长度前瞻

(rab(?!\w*oof)\w*)

粗体匹配:

raboof rab7790oof raboo rabof rab rabo raboooof rabo

据我所知,原始解决方案是:

Jeff 'japhy' Pinyan