否定多个单词

Oma*_*mar 5 regex perl

测试字符串:

${$var1} bla ${$var2} bla ${$var2}
\${$var2} bla \\\${$var2} bla $var1
\\${$var1} bla \\${$var2} bla \${$var2}
\\\{$var2} bla \\${$var2} bla \${$var2}
$var1 bla \$var1 bla \\$var1 bla \\\$var1
\$var1 bla \\$var1 bla \\\$var1
\\$var1 bla \\\$var1 bla \$var1 bla
\\\$var1 bla \\$var1 bla \\\$var1
Run Code Online (Sandbox Code Playgroud)

选择我正在寻找:

我正在寻找一个正则表达式,只${$varN}, \\${$varN}, $varN, \\$varN 选择而不选择\${$varN}, \\\${$varN}, \$varN, \\\$varN

我试过的正则表达式: (\$\{\$\w*\})|(\$\w*)但它选择了所有${$varN}$varN

anu*_*ava 3

您可以将此正则表达式与负向后查找一起使用:

(?<!\\|{)(?:\\\\)*\$(?:{\$)?\w*}?
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

正则表达式说明:

  • (?<!\\|{)- 负向前瞻断言我们没有反斜杠或{前一个字符
  • (?:\\\\)*- 匹配0对或多反斜杠
  • \$- 匹配文字$
  • (?:{\$)?- 匹配可选 {后跟$
  • \w+- 匹配 1 个或多个单词
  • }?- 匹配可选结束}

更新:如果您想要更精确的匹配(不允许${$var3),请使用此高级 PCRE 正则表达式,该表达式使用if-else-then以下构造:

(?<!\\|{)(?:\\\\)*\$({\$)?\w+(?(1)})
Run Code Online (Sandbox Code Playgroud)

正则表达式演示2