ruby regex lookbehind可选子字符串

时间:2014-05-05 20:01:01

标签: regex

在lookbehind中匹配可选子字符串显然是无效的lookbehind语法...

我正在尝试匹配单词static,但前面只有url((有或没有可选的单引号)

(?<=url\([']?)static

应该匹配:

url('静态带引号')

url(静态没有引号)

我使用了2个lookbehinds,但似乎没必要

(?:(?<=url\()|(?<=url\('))static

我可以在这里使用正则表达式技巧吗?

以下是rubular中的链接:http://rubular.com/r/iJ3ifrOmfZ

3 个答案:

答案 0 :(得分:0)

@tenub是对的,没有多少正则表达式引擎允许可变长度的lookbehinds。 '?看起来可变长度,因为它可能有也可能没有额外的字符。您的解决方案有效,但也可能出现leverage \K(重新开始匹配)的情况。

url\(    # matches url( literally
'?       # matches an optional '
\K       # reset your match (similar to if you had used a lookbehind)
static   # match static literally

我还制作了一个expanded syntax,它与url()url('')中的整个字符串匹配,只要它以static关键字开头即可。这个可以正常工作,因为你可以有可变长度的前瞻。

url\('?\Kstatic.*?(?='?\))

答案 1 :(得分:0)

有诀窍吗?是。

第一招: \ K(Sam已经提到),即url\('?\Kstatic

第二招:

(?<=url\(|url\(')static

这是因为ruby将允许预定长度的可变后视。

第三招:

(?<=(?<=url\()'|(?<=url\())static

第二招的变种

第四招:

url\('?(static)

“静态”将在第1组中捕获。

撇号是可选的,因此两个字符串都匹配。

演技#4演示(见第1组):http://regex101.com/r/eV5fN4http://regex101.com/r/qT0tG8

答案 2 :(得分:0)

您可以使用替换在Ruby中使用可变长度的lookbehind。但是,交替必须位于lookbehind子模式的底层:

工作模式:

(?<=url\('|url\()static
(?<=(?:url\('|url\())static # the non-capturing group is ignored because useless

不起作用

(?<=url\((?:'|))static      # the alternation is not at the ground level
(?<(?:url\('|url\()s)tatic  # doesn't work too.