regex match and replace in vscode for repetitive pattern

Alicia Y

I have this svg

<circle id="a/b/c" stroke="#2C2C2C" stroke-width="2" fill="#FFF" fill-rule="nonzero" cx="141" cy="21" r="9"/><text id="a/b/c-something" font-size="10" fill="#2C2C2C"><tspan x="0" y="10">a/b/c Something</tspan></text>

I want to replace id="a/b/c" to id="a-b-c" in the circle and also id="a/b/c-something" to id="a-b-c-something" in text and exclude a/b/c Something from being replaced.

I'm using vscode, and I've tried (id=.+)\/(.+) but it doesn't seem to match it properly. I want to

Wiktor Stribiżew

A generic way to do this is to match and capture the part before the first qualifying / char, match this char without capturing, and then match the part on the right to ensure the context is correct, and then replace with Group 1 value + new char + Group 2 value.

The general scheme is

Find:    (left-hand context)text to remove/replace(right-hand context)
Replace: $1new_text$2

Then repeat until no more changes are made to the document.

In your case, you can use

Find What:   (\sid="[^"/]*)/([^"]*"[^>]*>)
Replace With: $1-$2

See the regex demo. Details:

  • ( - Group 1:
    • \s - a whitespace
    • id=" - a fixed text
    • [^"]* - zero or more chars other than a " char
  • ) - end of Group 1
  • / - a / char
  • ( - Group 2:
    • [^"]* - zero or more chars other than "
    • " - a " char
    • [^>]* - zero or more chars other than >
    • > - a > char
  • ) - end of Group 2.

This will work for both File search and replace and In-document search and replace feature.

If you are applying the regex against a single document using In-document search and replace feature, you can make use of a lookaround-based pattern to achieve the goal in a single pass:

Find What:   (?<=\sid="[^"]*)/(?=[^"]*"[^>]*>)
Replace With: -

See this regex demo. Details:

  • (?<=\sid="[^"]*) - a positive lookbehind that matches a location that is immediately preceded with
    • \s - a whitespace
    • id=" - a fixed text
    • [^"]* - zero or more chars other than a " char
  • / - a / char
  • (?=[^"]*"[^>]*>) - a positive looahead that matches a location that is immediately followed with
    • [^"]* - zero or more chars other than "
    • " - a " char
    • [^>]* - zero or more chars other than >
    • > - a > char.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related