2016-07-25 96 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=(.*?[^\\])&/