Given regex does not match to the end

178 views Asked by At

I have a regex expression:

^([ \t\r]*\S+){2}$

It matches name and group matches e, in name.

I expected to not to match name, but name name; such as I wanted \S+ work till it matches. I can make it work just a bit changing it:

^([ \t\r]*\S+)([ \t\r]+\S+)$

but I hoped it would be possible to make it shorter.

3

There are 3 answers

1
user2357112 On BEST ANSWER

+, *, and ? are not possessive. They will match as much as they can if that produces a valid match, but if not, the regex engine will backtrack and try matching less. I don't think Python supports possessive quantifiers; you'll have to recode your regex if you don't want to match name.

1
ktm5124 On

You need to pass the global modifier. I'm not sure which programming language you are using, but the syntax often resembles the following:

/$myregex/g

For example, given the following text:

Hello Adam, how are you? Hello Sarah, how are you?

The regular expression /Hello\s(.*),/g will match both Adam and Sarah.

1
perreal On

With your original expression, ^([ \t\r]*\S+){2}$, na and me are matched separately as different groups since you do not force (due to the * in [ \t\r]*) a space character after the first group.

You can use a lookahead assertion:

^([ \t\r]*\S+(?!\S)){2}$

Or you can use alternation:

((^|\s+)\S+){2}$