特定模式的Regex匹配,不包括特定模式

Regex match for a specific pattern excluding a specific pattern

本文关键字:模式 不包括 Regex 匹配      更新时间:2023-09-26

我的示例字符串为:

  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=)(.*)([^''])(&)/ 

以及CCD_ 6功能
它对第二个字符串运行良好,但对第一个字符串,它选择直到最后一次出现不在''之前的"&"。

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=(.*?''&)*.*?[^'']&/

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

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

如果你只想要tooltext=&之间的文本,试着让它返回作为匹配组的重要部分:

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