user2688153
user2688153

Reputation: 47

Given regex does not match to the end

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.

Upvotes: 1

Views: 167

Answers (3)

user2357112
user2357112

Reputation: 281381

+, *, 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.

Upvotes: 1

perreal
perreal

Reputation: 98038

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}$

Upvotes: 0

ktm5124
ktm5124

Reputation: 12123

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.

Upvotes: 0

Related Questions