在1 Regexp中混合Lookahead和Lookbehind

时间:2016-04-01 11:03:05

标签: regex

我尝试在某些HTML字符串中匹配第一次出现的window.location.replace("http://stackoverflow.com")

特别是我想捕获整个HTML字符串中第一个window.location.replace条目的URL。

因此,为了捕获URL我制定了这两条规则:

  • 应该在此字符串之后:window.location.redirect("
  • 应该在此字符串")
  • 之前

为了实现它,我认为我需要使用lookbehind(第1条规则)和lookahead(第2条规则)。

我最终得到了这个正则表达式:

.+(?<=window\.location\.redirect\(\"?=\"\))

它不起作用。我甚至不确定像我一样混合这两个规则是合法的。

请帮我翻译我的规则到正则表达式?其他方式这样做(没有前瞻(后面))也赞赏。

1 个答案:

答案 0 :(得分:1)

您编写的模式实际上不是您需要的模式,因为它与您期望的内容完全不同:text window.location.redirect("=")中的text window.location.redirect("=") something。如果您从?之前删除\",它将会only work in PCRE/Python(因为在PCRE中,lookbehinds应该是固定宽度的)。它将与.NET正则表达式中的?一起使用。

如果是JS,你就不能使用lookbehind,因为它的正则表达式引擎不支持它们。

相反,请在想要获取的未知部分周围使用捕获组:

/window\.location\.redirect\("([^"]*)"\)/

/window\.location\.redirect\("(.*?)"\)/

请参阅regex demo

/g修饰符将仅允许匹配一次,第一次出现。访问第1组内所需的值。

([^"]*)捕获除双引号之外的0+个字符(您需要的URL不应该包含它)。如果这些网址包含",则应使用第二种方法,因为(.*?)将匹配除第一个")之前的换行符以外的任何0+个字符。