Что эквивалентно оператору сброса ветви ("?|"), Найденному в 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)
Это только установит группу один независимо от того, какая ветвь соответствует.