测试字符串:

${$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

我正在寻找的选择:

我正在寻找一个仅选择${$varN}, \\${$varN}, $varN, \\$varN的正则表达式
不用选择\${$varN}, \\\${$varN}, \$varN, \\\$varN
我尝试过的正则表达式:(\$\{\$\w*\})|(\$\w*),但它选择所有${$varN}$varN

最佳答案

您可以将此正则表达式与否定的后面一起使用:

(?<!\\|{)(?:\\\\)*\$(?:{\$)?\w*}?

RegEx Demo

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


  • 更新:如果您想进行更精确的匹配(不允许使用${$var3),请使用此使用if-else-then构造的高级PCRE正则表达式:
    (?<!\\|{)(?:\\\\)*\$({\$)?\w+(?(1)})
    

    RegEx Demo2

    10-04 16:49