如何在Javascript中实现正则表达式"lookbehind"

How to implement positive "lookbehind" of regular expressions in Javascript

更新问题

假设字符串"?foo=bar&nonfoo=bar&foo=bar",在这种情况下我需要捕获:

我用 Perlsee here 做了。

但是Javascript不支持lookbehind,那么表达式(?<=)(positive lookbehind)无法识别。

我也试过(?:[?&])((foo\=[^&#]*)|(foo(?=[&#]))|(foo(?!.)))(非捕获组语法),但是执行方法match返回:

从例子来看"foo?foo=bar&foo&foofoo""foo?foo=bar&foo&foo"

你可以试试正则表达式 (foo\=[^\&]*)|(foo(?=\&))|[^\w]foo(?!.)

这将从第一个字符串匹配 foo=barfoo。 并将匹配第二个字符串中的 foo=barfoo&foo

编辑:

使用非捕获组来弥补负面回顾的不足,您可以使用此正则表达式过滤掉最后一个 &(foo\=[^\&]*)|(foo(?=\&))|(?:\&(foo(?!.)))

RegexDemo

导致超过 "foo?foo=bar&foo&foo" 的匹配项的捕获组:

1) foo=bar

2) foo

3) foo

我不太确定你的结果应该是什么......但也许这个可以解决你的问题:

(?!foo\?)(foo(\=[^\?^&]+)?)+

这将匹配:

  • foo=bar
  • foo
  • foo foofoo

我认为正则表达式不是适合此目的的工具。

相反,首先使用 .split("?") 来分隔路径和查询。然后进行查询并 .split("&") 那个。现在你拥有所有你想要的作品。

您可以遍历它们以找到您需要的特定对象,或者更进一步 .split("=") 它们将 key/value 对分开。

一切都比正则表达式容易得多。

解决方案就在我们面前。抱歉我来晚了。

最终的正则表达式是:

\b(foo\b\=[^&#]*)

特殊字符\b设置了一个匹配的分界词,那么比如不匹配"nonfoo=bar",而是匹配"foo"、"foo=bar"等在 "foo" 之前不包含任何内容(将其作为正后视),但如果单词在 URI 哈希之后,它也会被匹配(目前没有办法解决这个问题)。