Home > database >  Regex to catch a name and multiple groups with the same pattern
Regex to catch a name and multiple groups with the same pattern

Time:03-24

I have the following strings:

| Elencia   { 1: Simple one, 0: A longer sentence, or maybe not, 2: Another sentence }
| Elencia   { 10:    Sentence with spaces on left,     0: Same but with some spaces on right      }

I would like to catch the name on the left and the number the sentence avoiding the multiple spaces on the left and the right.

I wrote this at the moment:

(?<point>[\d] ):\s (?<content>[\w ] )

but it only catches the part inside the curly brackets and it includes the spaces at the end, which is not what I want.

What I would like to have. First example:

- Elencia as name
- "1" as point, "Simple one" as sentence
- "0" as point, "A longer sentence, or maybe not" as sentence
- "2" as point, "Another sentence" as sentence

Second example:

- Elencia as name
- "10" as point, "Sentence with spaces on left" as sentence
- "0" as point, "Sentence with spaces on left" as sentence

I'm using the regex with gdscript but PHP or JavaScript style would work too.

Thank you for your help!

CodePudding user response:

You may use this regex:

(?:(?<name>\w )\s {|(?!^)\G)\W*(?<point>\d ):\s (?<content>. ?(?=,\s \d :|\s*}))

RegEx Demo

RegEx Details:

  • (?:: Start a non-capture group
    • (?<name>\w ): Match 1 word characters in group named name
    • \s {: Match 1 whitespace followed by a {
    • |: OR
    • (?!^)\G: Start from end of the previous match
  • ): End non-capture group
  • \W*: Match 0 non-word characters
  • (?<point>\d ): Match 1 digits in names capture group point
  • :\s : Match a : followed by 1 whitespace
  • (?<content>. ?(?=,\s \d:|\s*}):
  • (?=: Start a positive lookahead assertion
    • ,\s \d :: Match comma, 1 whitespace, 1 digits followed by :
    • |: OR
    • \s*}: Match 0 whitespace followed by }
  • ): End positive lookahead assertion
  • Related