2016-05-14 41 views
0

修订问题如何实现正则表达式的积极 “回顾后” 在Javascript

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

  • 富=酒吧
  • 富= FOO

我用Perl,see here

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

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

  • 富=酒吧
  • &富= FOO
+0

究竟应该匹配这个字符串'“foo?foo = bar&foo&foofoo”'? – Shafizadeh

+0

在这里,只有''foo = bar'''和'''foo'''。不要'''foo?''或者''&foofoo'''。 – rplaurindo

+0

在这个评论中,第二个'foo' ^是字符串中最后一个'foo'? – Shafizadeh

回答

0

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

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

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

的特殊字符\b设置匹配的边界字,然后,例如,它不匹配“nonfoo =栏”,但匹配“foo”的,“foo = bar”,并且在“foo”之前不包含任何内容(将其作为积极向后看),但如果该单词在URI Hash之后,它也匹配(现在无法解决此问题)。

+1

['[?&](foo(?:= [^&#] +)?)\ b'](https://regex101.com/r/pD4iJ8/10)? –

+0

匹配'''?foo = bar''',但只匹配''foo = bar'''。它不包括?要么 &。 – rplaurindo

+0

'?foo = bar'是整个比赛。在组#1中捕获“foo = bar”。 –

1

来自判断示例"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

+0

对不起,它不应该在任何对应中包含'''&'。 – rplaurindo

+0

你能否包含更多要匹配的示例字符串以及期望的输出是什么? – Wisph

+0

除了[that](https://regex101.com/r/eB6dU0/3)之外,我还想要包含字符串'''“foo”的最后一个'''foo''? foo = bar&foo&foo“''',但没有字符'''&'''明白吗? – rplaurindo

1

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

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

这将匹配:

  • foo = bar
  • foo
  • FOO foofoo
+0

几乎就是这样。不应该对应于'''foofoo'''。 – rplaurindo

1

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

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

您可以遍历它们以找到您需要的特定对象,或者向前走一步,然后使用.split("=")分隔键/值对。

比正则表达式要容易得多。

+0

这是真的,但我正在学习正则表达式。 :) – rplaurindo

+1

学习正则表达式的一部分,正在学习什么时候不使用它。这就像拿一把大锤在瓶子里建造一艘船“因为我在学习大锤”。 –