Cronos87
Cronos87

Reputation: 1926

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

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!

Upvotes: 1

Views: 68

Answers (1)

anubhava
anubhava

Reputation: 785286

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

Upvotes: 3

Related Questions