2016-05-14 38 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

學習正則表達式的一部分,正在學習什麼時候不使用它。這就像拿一把大錘在瓶子裏建造一艘船「因爲我在學習大錘」。 –