简体   繁体   中英

Perl Regex return named groups in capture Group one

I try to get a regex which returns the match in the first capture group.

The Application where I put the regex in can only use the first capture Group.

Each regex on it's own is working, but i can't combine these two in a way that the output is always in the first capture group

Input 1:

Event: Started Flapping

Regex 1:

^Event: (\S+ Flapping)

Output 1:

Started Flapping

Input 2:

Event: CRIT -> OK

Regex 2:

^Event:\s+\S+\s+\S+\s+(\S+)

Ouput 2:

OK

The Regex i tried (?:^Event:\s+\S+\s+\S+\s+(?P<service>\S+)$|^Event: (?P<flap>Started Flapping)|((?P=service)|(?P=flap)))

You can use a branch reset group :

^Event:\s+(?|\S+\s+\S+\s+(\S+)|(Started Flapping))$
# or, to factor in \S+\s+:
^Event:\s+(?|(?:\S+\s+){2}(\S+)|(Started Flapping))$

See the regex demo . Details :

  • ^ - start of string
  • Event: - a fixed string
  • \s+ - one or more whitespaces
  • (?| - start of a branch reset group:
    • \S+\s+\S+\s+ - two occurrences of one or more non-whitespaces followed with one or more whitespaces
    • (\S+) - Group 1: one or more non-whitespaces
  • | - or
    • (Started Flapping) - Group 1: Started Flapping fixed string
  • ) - end of the branch reset group
  • $ - end of string.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM