排除特定模式的特定模式的正则表达式匹配

Regex match for a specific pattern excluding a specific pattern

我有示例字符串:

  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'

我的 objective 是 select 从“tooltext=”到第一次出现“&”(前面没有 \)的文本.我正在使用以下正则表达式:

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

.match() 函数。
它适用于第二个字符串,但对于第一个字符串,它是 selecting 直到最后一次出现 '&' 之前没有 \.

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", "&"]

我想你可以像这样使用正则表达式:

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

[Regex Demo]

并且总能找到一个非转义的 &:

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

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

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

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

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