Что эквивалентно оператору сброса ветви ("?|"), Найденному в php(pcre) в C#?

Следующее регулярное выражение будет соответствовать "суббота" или "воскресенье": (?:(Sat)ur|(Sun))day

Но в одном случае обратная ссылка 1 заполняется, а обратная ссылка 2 пуста, а в другом - наоборот.

PHP (pcre) предоставляет хороший оператор "?|" что обходит эту проблему. Предыдущее регулярное выражение станет (?|(Sat)ur|(Sun))day, Так что не будет пустых обратных ссылок.

Есть ли эквивалент в C# или какой-то обходной путь?

3 ответа

Решение

.NET не поддерживает оператор ветвления-сброса, но поддерживает именованные группы и позволяет повторно использовать имена групп без ограничений (что-то, что не делает никакой другой вариант, AFAIK). Таким образом, вы можете использовать это:

(?:(?<abbr>Sat)ur|(?<abbr>Sun))day

... и сокращенное имя будет сохранено в Match.Groups["abbr"],

Должно быть возможно объединить backref1 и backref2.
Поскольку каждый из них всегда пуст, а строка с пустым конкатом - это та же самая строка...

с вашим регулярным выражением (?:(Sat)ur|(Sun))day и замена $1$2
ты получаешь Sat за Saturday а также Sun за Sunday,

 regex (?:(Sat)ur|(Sun)) день
 вход | backref1 _$1_ | backref2 _$2_ | 'concat' _$1$2_
 ---------|---------------|---------------|----------------
 Суббота | "Сб" | ''            | 'Sat'+'' = Sat
 Воскресенье | '' | 'Солнце'         | ''+'Солнце' = Солнце

вместо чтения backref1 или backref2 просто прочитайте оба результата и сопоставьте результат.

Вы можете использовать оператор возврата ветки:

(?|foo(bar)|still(life)|(like)so)

Это только установит группу один независимо от того, какая ветвь соответствует.

Другие вопросы по тегам