For example I want to match three values, required text, optional times and id, and the format of id is [id=100000], how can I match data correctly when text contains spaces.
my reg: (?<text>[\s\S] ) (?<times>\d )? (\[id=(?<id>\d )])?
example source text: hello world 1 [id=10000]
In this example, all of source text are matched in text
CodePudding user response:
The problem with your pattern is that matches any whitespace and non whitespace one and unlimited times, which captures everything without getting the other desired capture groups. Also, with a little help with the positive lookahead and alternate (|) , we can make the last 2 capture groups desired optional.
The final pattern (?<text>[a-zA-Z ] )(?=$|(?<times>\d )? \[id=(?<id>\d )])
- Group text will match any letter and spaces.
- The lookahead avoid consuming characters and we should match either the string ended, or have a number and [id=number]
Said that, regex101 with further explanation and some examples
CodePudding user response:
You could use:
:\s*(?<text>[^][:] ?)\s*(?<times>\d )? \[id=(?<id>\d )]
Explanation
:Match literally\s*Match optional whitespace chars(?<text>Group text[^][:] ?match 1 occurrences of any char except[]:
)Close group text\s*Match optional whitespace chars(?<times>\d )?Group times, match 1 digits\[id=Match[id=(?<id>\d )Group id, match 1 digirs]Match literally
