Home > Net >  Regex Find Missing Double Bracket tags and remove them
Regex Find Missing Double Bracket tags and remove them

Time:11-22

i have string like this

{wrongTag}} RegExr was {{created}aaaa{{fffffff}} shks {{sdfsdfsd} and {{created}aaaa{{fffffff}

i want to remove all wrong tags either single bracket is missing from the start or end of tag. in example about only {{fffffff}} is correct tag all other tags are worng should be removed , my code is this for removing all wrong tags

const cleanString = message.replace(/(?!{{[^{{}}] \}\})\{{[^{{}}] \}/g, "")

but my regex is only detecting last missing baraket . So following wrong tag also be matched

https://regexr.com/69vlq

{wrongTag}}

{missingtag}

Below is my Regex , you can see its working partially but not fully any help would be appricated

https://regexr.com/69vlq

CodePudding user response:

You can use

const cleanString = message.replace(/(?<!{)({{[^{}] }})(?!})|{ [^{}]*} /g, '$1');

Or,

const cleanString = message.replace(/((?:[^{]|^){{[^{}] }})(?!})|{ [^{}]*} /g, '$1');

See the regex demo #1 / regex demo #2. The point is to match and capture into Group 1 any valid tag, and then match and remove the tags with any one or more curly braces around them.

Details:

  • (?<!{) - a negative lookbehind that fails the match if there is a { char immediately to the left of the current location
  • ({{[^{}] }}) - Group 1: {{, one or more chars other than { and }, and then }}
  • (?!}) - a negative lookahead that fails the match if there is a } char immediately to the right of the current location
  • | - or
  • { - one or more { chars
  • [^{}]* - zero or more chars other than { and }
  • } - one or more } chars.

In the no-lookbehind solution, (?<!{) is replaced with (?:[^{]|^) that matches either a char other than { (with [^{]) or start of string (with ^).

CodePudding user response:

If you're looking for mismatched brackets, you could use the following test for missing leading brackets

[^{]{([^{}] )\}\}

and this for missing trailing brackets

{{([^{}] )\}[^}]

and this for missing leading and trailing brackets

[^{]{([^{}] )\}[^}]

It can by done with a single regex; but you're well on your way to write only code when you try to make a regular expression do more than a single operation at a time.

In plain english; the first expression would read: Find the first '{' that is not preceded by a '{'. Match a group of characters that do not contain '{' or '}' until you reach a '}' followed by another '}'

The second is basically the same statement, but it reads: Find the first "{{". Match a group of characters that do not contain '{' or '}' and consider it a match if the next '}' is not followed by '}'.

The third is just a combination of the first two, to match items that are wrapped in "{}" but not in "{{}}"

  • Related