我想检测以$
开头的单词,但忽略以$$
开头的单词,因为我想为用户提供一种逃脱该字符的方式。
我尝试了很多事情,但更接近的是:[^\$]\$\w+
它将The side bar $$includes a| $Cheatsheet|, full
之类的出现与单词$Cheatsheet
开头的空格匹配。它应该仅与单词$Cheatsheet
匹配,没有空格。
我该怎么办?有什么想法吗?
答案 0 :(得分:2)
您尝试过的正则表达式[^\$]\$\w+
将不匹配美元符号,后跟美元符号和一个或多个单词字符。例如,将a$Cheatsheet
或$Cheatsheet
与前导空格匹配。请注意,您不必在字符类中转义美元符号。
如果支持negative lookbehinds,为了匹配不以美元符号开头的单词,您可以使用:
(?<!\$)\$\w+
无需后顾之忧,您可以匹配不需要的内容,并在捕获组中捕获所需的内容。
\${2}\w+|(\$\w+)
如果美元符号也不能位于单词的中间,则可以使用:
\S(?:\$+\w+)+\$?|(\$\w+)
答案 1 :(得分:0)
由于所有JavaScript引擎(https://github.com/tc39/proposal-regexp-lookbehind)尚不支持负向后看,因此您可以从正则表达式开始并引入一个匹配组:
[^\$](\$\w+)
然后,要排除aaa$bbb
,可以使用:
\s(\$\w+)
编辑:并在标点符号的开头或之后进行匹配:
(?:^|[^$\w])(\$\w+)
答案 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);