【问题标题】:How to implement positive "lookbehind" of regular expressions in Javascript如何在 Javascript 中实现正则表达式的积极“后视”
【发布时间】:2016-05-14 09:41:51
【问题描述】:

更新问题

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

  • foo=bar
  • foo=foo

我对@9​​87654323@、see here 做过。

但Javascript不支持lookbehind,则表达式(?<=)(正向lookbehind)无法识别。

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

  • ?foo=bar
  • &foo=foo

【问题讨论】:

  • 这个字符串"foo?foo=bar&foo&foofoo"到底应该匹配什么?
  • 这里只有foo=barfoo。不要foo?&foofoo
  • 这个评论中的第二个foo ^ 是字符串中的最后一个foo
  • 你认为[^$] 是什么意思,因为我不认为它是你认为的意思。
  • @Shafizadeh 我不明白你的问题。可以更清楚吗?

标签: javascript regex lookbehind


【解决方案1】:

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

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

这将匹配:

  • foo=bar
  • foo foofoo

【讨论】:

  • 差不多就是这样。不应对应于foofoo
【解决方案2】:

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

相反,首先使用.split("?") 将路径和查询分开。然后进行查询和.split("&")。现在你拥有了所有你想要的东西。

您可以遍历它们以找到您需要的特定的,或者更进一步并.split("=")它们来分离键/值对。

一切都比正则表达式简单得多。

【讨论】:

  • 学习正则表达式的一部分,是学习何时不使用它。这就像拿大锤在瓶子里造船“因为我正在研究大锤”。
【解决方案3】:

"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

【讨论】:

  • 对不起。它不应在任何通信中包含&
  • 您能否包含更多要匹配的示例字符串以及所需的输出是什么?
  • 我想要除了that之外,还包括字符串"foo?foo=bar&foo&foo"的最后一个foo,但没有字符&。明白了吗?
  • 这可以很容易地使用消极的后视(?<!\&) 来完成。遗憾的是,这在 JavaScript 中是不可能的。如果您想要单个实体正则表达式来解决您的需求,您可能需要考虑重写后向。
  • 您可以尝试有意匹配前导&,然后将其包装在非捕获组?: 中。正则表达式的最后一部分将变为 (?:\&)foo(?!.)
【解决方案4】:

解决方案摆在我们面前。对不起,我迟到了。

最后的正则表达式是这样的:

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

特殊字符\b设置了匹配的边界词,比如不匹配“nonfoo=bar”,而是匹配“foo”、“foo=bar”且之前不包含任何内容“foo”(作为肯定的后视),但如果单词在 URI Hash 之后,它也匹配(目前没有办法解决这个问题)。

【讨论】:

  • 匹配?foo=bar,但不匹配foo=bar。它不包括 ?或 &。
  • ?foo=bar 是整个匹配。 foo=bar 在组 #1 中被捕获。
  • 为了make替换它?我会尝试。它可能会起作用。
  • 它有效。在.replace 方法的回调中使用"if" 语句来捕获分隔符(?&),但它也可以正常工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多