Home > front end >  Regex to catch strings that are not inside string pattern
Regex to catch strings that are not inside string pattern

Time:06-13

I want to find a regex that catch all strings that are not inside name('stringName') pattern.

For example I have this text:

fdlfksj "hello1" dsffsf "hello2\"hi" name("Tod").name('tod') 'hello3'

I want my regex to catch the strings: "hello1", "hello2\"hi", 'hello3' (it should also should catch "hello2\"hi" because I want to ignore " escaping).

I want also that my regex will ignore "Tod" because it's inside the pattern name("...") How should I do it?

Here is my regex that doens't work:

((?<!(name\())("[^"]*"|'[^']*'))

It doesn't work with ignore escaping: \" and \'

and it's also not ignore name("Tod")

enter image description here

How can I fix it?

CodePudding user response:

You can use the following regex:

(?<!name\()(["'])[^\)] ?(?<!\\)\1

It will match anything other than parenthesis ([^\)] ?):

  • preceeded by (["']) - a quote symbol
  • followed by (?<!\\)\1 - the same quote symbol, which is not preceeded by a slash

In order to avoid getting the values that come after name(, there's a condition that checks that (?<!name\().

Check the demo here.

CodePudding user response:

(["'])((?:\\\1)|[^\1]*?)\1

Regex Explanation

  • ( Capturing group
    • ["'] Match " (double) or ' (single) quote
  • ) Close group
  • ( Capturing group
    • (?: Non-capturing group
      • \\\1 Match \ followed by the quote by which it was started
    • ) Close non-capturing group
    • | OR
    • [^\1]*? Non-gready match anything except a quote by which it was started
  • ) Close group
  • \1 Match the close quote

See the demo

CodePudding user response:

You could get out of the way what you don't want, and use a capture group for what you want to keep.

The matches that you want are in capture group 2.

name\((['"]).*?\1\)|('[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*")

Explanation

  • name\((['"]).*?\1\) Match name and then from the opening parenthesis till closing parenthesis between the same type of quote
  • | Or
  • ( Capture group 2
    • ('[^'\\]*(?:\\.[^'\\]*)*' match the single quoted value including matching escapes ones
    • |Or
    • [^"\\]*(?:\\.[^"\\]*)*" The same for the double quotes
  • ) Close group 2

Regex demo

  • Related