Discard a few words

Test string:

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

The choice I'm looking for:

I am looking for a regex to select only ${$varN}, \\${$varN}, $varN, \\$varN without selecting \${$varN}, \\\${$varN}, \$varN, \\\$varN

Regex I tried: (\$\{\$\w*\})|(\$\w*) , but it selects all ${$varN} and $varN

+5
source share
1 answer

You can use this regex with negative lookbehind:

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

RegEx Demo

RegEx Description:

  • (?<!\\|{) - A negative look to say that we don’t have a backslash or { like the previous character
  • (?:\\\\)* - matches 0 or more backslash pairs
  • \$ - match literal $
  • (?:{\$)? - match optional { followed by $
  • \w+ - Match 1 or more words
  • }? - match optional closure }

Update:. If you need a more accurate match (one of which forbids ${$var3 ), use this extended PCRE regular expression that uses the if-else-then :

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

RegEx Demo2

+3
source

Source: https://habr.com/ru/post/1264266/


All Articles