Механизм регулярных выражений пытается сопоставить альтернативы в том порядке, в котором они указаны. Поэтому, когда шаблон (foo|foobar)&?
сразу же foo
, он продолжает поиск совпадений. Следующий бит входной строки - bar& b
, который не может быть сопоставлен.
Другими словами, поскольку foo
является частью foobar
, нет способа (foo|foobar)
когда-либо соответствовать foobar
], так как он всегда будет соответствовать foo
.
Иногда это может быть очень полезным трюком. Шаблон (o|a|(\w))
позволит вам захватить \w
и a
или o
по-другому:
Regex.Replace("a foobar& b", "(o|a|(\\w))", "$2") // fbr& b