否定多个单词

时间:2017-02-15 19:04:07

标签: 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

选择我正在寻找:

我正在寻找只选择${$varN}, \\${$varN}, $varN, \\$varN的正则表达式 没有选择\${$varN}, \\\${$varN}, \$varN, \\\$varN

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

1 个答案:

答案 0 :(得分:3)

您可以将此正则表达式与负面的lookbehind一起使用:

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

RegEx Demo

RegEx说明:

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

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

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

RegEx Demo2

相关问题