The regular expression engine tries to match the alternatives in the order in which they are specified. So when the pattern is (foo|foobar)&?
it matches foo
immediately and continues trying to find matches. The next bit of the input string is bar& b
which cannot be matched.
In other words, because foo
is part of foobar
, there is no way (foo|foobar)
will ever match foobar
, since it will always match foo
first.
Occasionally, this can be a very useful trick, actually. The pattern (o|a|(w))
will allow you to capture w
and a
or o
differently:
Regex.Replace("a foobar& b", "(o|a|(\w))", "$2") // fbr& b
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…