How can I force two patterns to capture to the same group in regEx

Viewed 2460

I have to parse a string, formatted as!info1!info2!, and info2 is optional.

I am trying to capture, using a regular expression, info1 and info2 if needed.

I came up with the following pattern:

!([^!]*?)!(.*?)!|!(.*?)! 

It works, but I am not satisfied with the results:

!foo!bar! -> Group1: foo Group2:bar
!foo!     -> Group3: foo
(https://regex101.com/r/D9d6YP/1)

In both expression, foo means the same thing, and is to be process in the same way afterwards. I would like to capture it in the same group, whether or not there is a second group.

I have tried to use named capture groups, but it seems like they can't be reused

!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!

fails with the error message 'a sub-pattern name must be unique.

Is there any way to capture different patterns in the same group?

1 Answers
Related