C # — Почему порядок альтернатив имеет значение в регулярных выражениях?

Код

using System;
using System.Text.RegularExpressions;

namespace RegexNoMatch {
class Program {
static void Main () {
string input = "a foobar& b";
string regex1 = "(foobar|foo)&?";
string regex2 = "(foo|foobar)&?";
string replace = "$1";
Console.WriteLine(Regex.Replace(input, regex1, replace));
Console.WriteLine(Regex.Replace(input, regex2, replace));
Console.ReadKey();
}
}
}

Ожидаемый результат

a foobar b
a foobar b

Фактический вывод

a foobar b
a foobar& b

Вопрос

Почему замена не работает, когда порядок «foo» и «foobar» в шаблоне регулярных выражений изменяется? Как это исправить?

3

Решение

Механизм регулярных выражений пытается сопоставить альтернативы в том порядке, в котором они указаны. Итак, когда шаблон (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
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector