skip to Main Content

Below is the REGEX which I am trying:

/((?<![\\])['"])((?:.(?!(?<![\\])\1))*.?)\1/

Here this is the text which I am giving

val1=""val2>"2022-11-16 10:19:20"

I need blank expressions like for val1 as well,
i.e. I need something like below in matches

""
2022-11-16 10:19:20

If I change the text to something like below, I am getting proper output

val2>"2022-11-16 10:19:20"val1=""

Can anyone please let me know where I am going wrong

2

Answers


  1. Use alternatives to match the two cases.

    One alternative matches the pair of quotes, the other uses lookarounds to match the inside of two quotes.

    ""|(?<=")[^"]+(?=")
    
    Login or Signup to reply.
  2. In your pattern, this part (?:.(?!(?<![\])1))* first matches any character and then it asserts that what is to the right is not a group 1 value without an escape

    So in this string ""val2>" your whole pattern matches " with the character class ["'] and then it matches " again with the . From the position after that match, it is true that what is to the right is not the group 1 value without a preceding and that is why that match is ""val2>" instead of ""


    If the second example string does give you a proper output, you could reverse the dot and first do the assertiong in the repeating part of the pattern, and omit matching an optional char .?

    Note that the backslash does not have to be in square brackets.

    (?<!\)(['"])((?:(?!(?<!\)1).)*+)1
    

    See the updated regex101 demo.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search