在lookbehind中匹配可选子字符串显然是无效的lookbehind语法...
我正在尝试匹配单词static
,但前面只有url(
(有或没有可选的单引号)
(?<=url\([']?)static
应该匹配:
url('静态带引号')
url(静态没有引号)
我使用了2个lookbehinds,但似乎没必要
(?:(?<=url\()|(?<=url\('))static
我可以在这里使用正则表达式技巧吗?
以下是rubular中的链接:http://rubular.com/r/iJ3ifrOmfZ
答案 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/eV5fN4和http://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.