johnco3
johnco3

Reputation: 2642

Parsing multiple groups from a regular expression

I am having a problem parsing some fields from the following regular expression which I uploaded to rubular. The string that I am parsing is a special header from the banner of an FTP server. In order for me to process this banner, the line

special:pTXT1TOCAPTURE^:mTXT2TOCAPTURE^:uTXT3TOCAPTURE^

I thought that: (?i)^special(:[pmu](.*?)\^)?* would do the trick, however unfortunately this only gives me the last match and I am not sure why as I am lazily trying to capture each group. Also note that I should be able to capture an empty string also, i.e. if for ex the match string contains :u^

Wrap words Show invisibles Ruby version Match result: special:pTXT1TOMATCH^:mTXT2TOMATCH^:uTXT3TOMATCH^ Match groups:

  1. :uTXT3TOMATCH^
  2. TXT3TOMATCH

The idea is that the line must start with the test 'special' followed by up to 3 capture groups delimited with p,m or u lazily up to the next ^ symbol. I need to capture the text indicated above - basically I need to find TXT1TOCAPTURE, TXT2TOCAPTURE, and TXT3TOCAPTURE. There should be at least one of these three capture groups.

Thanks in advance

Upvotes: 0

Views: 257

Answers (2)

revo
revo

Reputation: 48711

You have two problems with your RegEx, one is syntactic and one is conceptual.

Syntactic:

We don't have such a modifier ?* in PCRE but it is equal to * in Ruby which denotes a greedy quantifier. In the case of applying to a capturing group it captures last match.

Conceptual:

Using a lazy quantifier .*? doesn't provide you with continues matches. It stops immediately on engine satisfaction. While g modifier is on next match will never occur as there is no ^special at the next position of last match.

Solution is using \G token to benefit from its mean of start matching at the end of previous match:

(?:special|(?!\A)\G):([pmu][^^]*\^)

Live demo

Upvotes: 1

Jan
Jan

Reputation: 43169

You might want to have the \G modifier:

(?:(?:^special:)|\G(?!\A)\^:)[pmu]([^^]+)

See it working on rubular.com.

Upvotes: 0

Related Questions