正则表达式匹配特定模式,不包括特定模式

时间:2016-07-25 02:47:40

标签: javascript regex regex-negation

我有一个示例字符串:

  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'
  3. 我的目标是从“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 个答案:

答案 0 :(得分:2)

我认为你可以使用这样的正则表达式:

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

[Regex Demo]

始终找到一个未转义的&

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

答案 1 :(得分:0)

看起来你的正则表达式一直匹配 last &,而不是第一个没有反斜杠的正面。尝试添加?运算符,使其匹配尽可能小,如下所示:

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

如果您只想要tooltext=&之间的文字,请尝试将其作为匹配组返回重要部分:

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