Каков эквивалент оператора ветвления 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)
Это установит только группу, независимо от того, какая ветка соответствует.