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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 21 марта 2011

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

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

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

3 голосов
/ 21 марта 2011

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

0 голосов
/ 21 марта 2011

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

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

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

...