2016-07-25 135 views
0

我爲樣本字符串:正則表達式匹配特定模式排除特定模式

  1. '&label=20:01:27&tooltext=abc\&|\|cba&value=6|59|58|89&color=ff0000|00ffff'
  2. '&label=20:01:27&tooltext=abc\&|\|cba&value=6|59|58|89'

我的目標是選擇「tooltext=」直到第一文本發生'&',這之前沒有\\。我正在使用以下正則表達式:

/(tooltext=)(.*)([^\\])(&)/ 

.match()函數。
對於第二個字符串它正在工作正常,但對於第一個字符串,它正在選擇最後一次出現的'&',前面沒有\\

var a = '&label=20:01:27&tooltext=abc\&|\|cba&value=6|59|58|89&color=ff0000|00ffff', 
b = a.match(/(tooltext=)(.*)([^\\])(&)(.*[^\\]&)?/i) 

結果,

b = ["tooltext=abc\&|\|cba&value=40|84|40|62&", "tooltext=", "abc\&|\|cba&value=40|84|40|6", "2", "&"] 

但我需要的是:

b = ["tooltext=abc&||cba&", "tooltext=", "abc&||cb", "a", "&"] 

回答

2

我認爲你可以使用這樣的正則表達式:

/tooltext=(.*?\\&)*.*?&/ 

[Regex Demo]

,並總能找到一個非轉義&

/tooltext=(.*?\\&)*.*?[^\\]&/ 
+0

感謝您的網站鏈接! regex101.com書籤。 –

+0

感謝您的幫助。 –

+0

@ shA.t - 恐怕但它與以下文字匹配 'value = 66,34 | 77,99&tooltext = av \&,\,| \&\ |,'' 但理想情況下,它不應該是因爲它沒有逃脫& –

0

它看起來像你的正則表達式是在它的前面一路匹配到最後&而不是第一個沒有反斜線。嘗試添加?操作,使其匹配儘可能小,像這樣:

/(tooltext=)(.*?)([^\\])(&)/

如果你只是想tooltext=&之間的文本,試試這個,使其返回重要組成部分匹配的組:

/tooltext=(.*?[^\\])&/