2016-09-14 168 views
3

我必須得到以="開頭並以"結尾的字符串。但它應該包含<符號。如何爲正則表達式添加條件?

(="([^"])*<*") 

字符串:

dit niet "dit wel" dit ook niet ="maar <dit ""en""dit ook" 
REM dit niet "dit <wel" dit ook niet ="maar dit ""en""dit ook" 
dit niet "dit wel" REM "maar dit ""en""dit ook" 

上面的代碼給我兩串,我只需要一個下面提到得到。

預期結果:

="maar <dit " 

實際結果:

="maar <dit " 
="maar dit " 

注: 需要獲得所有與="開始,有<結果並與"

回答

3
下一個出現結束

您的="([^"])*<*"正則表達式匹配=",那麼它捕獲以外的任何字符"反覆(使得只有它的最後一個匹配被保存在第1組緩衝液),然後零個或多個<符號隨後與"。所以,你的正則表達式並不真的需要 a <出現在你匹配的字符串中。

您可以使用

="([^"<]*<[^"]*)" 

regex demo

詳細

  • =" - 一個="序列
  • ([^"<]*<[^"]*) - 第1組,將持有的價值: 個
    • [^"<]* - 零個或多個字符比"<
    • <其他 - 一個<符號
    • [^"]* - 比"
  • "其他零個或多個字符 - 雙引號
+0

如果你關心不必要的回溯,你應該考慮使用'* +'而不是'*'。雖然你的回答避免了匹配情況下的回溯,但引擎可能會浪費時間在不匹配的情況下,在不可能包含它們的地方搜索字符。 – Holger

+0

@Holger JS正則表達式不支持所有格量​​詞。 –

+0

好吧,問題用'[javascript]'*和*'[java]'標記,這引起了一些混淆。我認爲,OP應該決定其中的一個...... – Holger

2

切換你的正則表達式到

(="([^"]*<[^"]*)*") 

直播here

這部分([^"]*<[^"]*)確保你的內心字符串將包含<

+2

有一些不必要的回溯你的第一個'[^「] *'因爲它也匹配'<'。查看我的答案如何可以簡化模式。 –