Какой эквивалент оператора сброса ветвей ("?|") можно найти в php (pcre) в C#?


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

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

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

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

Author: Stephan, 2011-03-21

3 answers

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

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

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

 12
Author: Alan Moore, 2011-03-21 13:15:25

Должно быть возможно объединить 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 просто прочитайте оба результата и объедините результат.

 3
Author: bw_üezi, 2011-03-21 14:50:10

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

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

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

 -1
Author: tchrist, 2011-03-21 20:34:31