正则表达式:将一个单词与指定字符的刚出现一次匹配

时间:2018-09-28 09:47:34

标签: javascript regex

我想检测以$开头的单词,但忽略以$$开头的单词,因为我想为用户提供一种逃脱该字符的方式。

我尝试了很多事情,但更接近的是:[^\$]\$\w+

它将The side bar $$includes a| $Cheatsheet|, full之类的出现与单词$Cheatsheet开头的空格匹配。它应该仅与单词$Cheatsheet匹配,没有空格。

我该怎么办?有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您尝试过的正则表达式[^\$]\$\w+将不匹配美元符号,后跟美元符号和一个或多个单词字符。例如,将a$Cheatsheet$Cheatsheet与前导空格匹配。请注意,您不必在字符类中转义美元符号。

如果支持negative lookbehinds,为了匹配不以美元符号开头的单词,您可以使用:

(?<!\$)\$\w+

Regex demo

无需后顾之忧,您可以匹配不需要的内容,并在捕获组中捕获所需的内容。

\${2}\w+|(\$\w+)

Regex demo

如果美元符号也不能位于单词的中间,则可以使用:

\S(?:\$+\w+)+\$?|(\$\w+)

Regex demo

答案 1 :(得分:0)

由于所有JavaScript引擎(https://github.com/tc39/proposal-regexp-lookbehind)尚不支持负向后看,因此您可以从正则表达式开始并引入一个匹配组:

[^\$](\$\w+)

然后,要排除aaa$bbb,可以使用:

\s(\$\w+)

编辑:并在标点符号的开头或之后进行匹配:

(?:^|[^$\w])(\$\w+)

https://regex101.com/r/3cW5oY/2

答案 2 :(得分:0)

您想用$转义$。这意味着,您需要

/(?:^|[^$])(?:\${2})*\B(\$\w+)/g

请参见regex demo

详细信息

  • (?:^|[^$])-字符串或除$以外的任何字符的开头
  • (?:\${2})*-重复两次或多次重复打双美元(这是避免与文字美元匹配的要求)
  • \B-在下一个$前需要字符串或非单词char开头
  • (\$\w+)-第1组:一个$,然后是1个以上的字符字符。

JS演示:

var s = "The $side bar $$includes a| $Cheatsheet|, $$$$full aaa$side";
var res = [], m;
var rx = /(?:^|[^$])(?:\${2})*\B(\$\w+)/g;
while(m=rx.exec(s)) {
  res.push(m[1]);
}
console.log(res);