Какой эквивалент оператора сброса ветвей ("?|") можно найти в php (pcre) в C#?
Следующее регулярное выражение будет соответствовать "Субботе" или "Воскресенью" : (?:(Sat)ur|(Sun))day
Но в одном случае обратная ссылка 1 заполнена, в то время как обратная ссылка 2 пуста, а в другом случае наоборот.
PHP (pcre) предоставляет хороший оператор "?|", который позволяет обойти эту проблему. Предыдущее регулярное выражение станет (?|(Sat)ur|(Sun))day
. Так что пустых обратных ссылок не будет.
Есть ли эквивалент в C# или какой-то обходной путь?
3 answers
.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))day input | backref1 _$1_ | backref2 _$2_ | 'concat' _$1$2_ ---------|---------------|---------------|---------------- Saturday | 'Sat' | '' | 'Sat'+'' = Sat Sunday | '' | 'Sun' | ''+'Sun' = Sun
Вместо чтения backref1 или backref2 просто прочитайте оба результата и объедините результат.
Вы можете использовать оператор сброса ветвей:
(?|foo(bar)|still(life)|(like)so)
Это установит только первую группу, независимо от того, какая ветвь соответствует.