Каков эквивалент оператора ветвления reset ( "? |" ), Найденного в php (pcre) в С#?

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

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

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

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

Ответ 1

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

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

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

Ответ 2

должно быть возможно выполнить concre backref1 и backref2.
Поскольку каждый из них всегда пуст, а строка concat with empty остается той же строкой...

с вашим регулярным выражением (?:(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

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

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

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