如何在Javascript中实现正则表达式"lookbehind"
How to implement positive "lookbehind" of regular expressions in Javascript
更新问题
假设字符串"?foo=bar&nonfoo=bar&foo=bar"
,在这种情况下我需要捕获:
- foo=bar
- foo=foo
我用 Perl
、see here 做了。
但是Javascript不支持lookbehind,那么表达式(?<=)
(positive lookbehind)无法识别。
我也试过(?:[?&])((foo\=[^&#]*)|(foo(?=[&#]))|(foo(?!.)))
(非捕获组语法),但是执行方法match
返回:
- ?foo=bar
- &foo=foo
从例子来看"foo?foo=bar&foo&foofoo"
和"foo?foo=bar&foo&foo"
你可以试试正则表达式 (foo\=[^\&]*)|(foo(?=\&))|[^\w]foo(?!.)
这将从第一个字符串匹配 foo=bar
和 foo
。
并将匹配第二个字符串中的 foo=bar
、foo
和 &foo
。
编辑:
使用非捕获组来弥补负面回顾的不足,您可以使用此正则表达式过滤掉最后一个 &
:(foo\=[^\&]*)|(foo(?=\&))|(?:\&(foo(?!.)))
导致超过 "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 哈希之后,它也会被匹配(目前没有办法解决这个问题)。
更新问题
假设字符串"?foo=bar&nonfoo=bar&foo=bar"
,在这种情况下我需要捕获:
- foo=bar
- foo=foo
我用 Perl
、see here 做了。
但是Javascript不支持lookbehind,那么表达式(?<=)
(positive lookbehind)无法识别。
我也试过(?:[?&])((foo\=[^&#]*)|(foo(?=[&#]))|(foo(?!.)))
(非捕获组语法),但是执行方法match
返回:
- ?foo=bar
- &foo=foo
从例子来看"foo?foo=bar&foo&foofoo"
和"foo?foo=bar&foo&foo"
你可以试试正则表达式 (foo\=[^\&]*)|(foo(?=\&))|[^\w]foo(?!.)
这将从第一个字符串匹配 foo=bar
和 foo
。
并将匹配第二个字符串中的 foo=bar
、foo
和 &foo
。
编辑:
使用非捕获组来弥补负面回顾的不足,您可以使用此正则表达式过滤掉最后一个 &
:(foo\=[^\&]*)|(foo(?=\&))|(?:\&(foo(?!.)))
导致超过 "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 哈希之后,它也会被匹配(目前没有办法解决这个问题)。