Следующее регулярное выражение будет соответствовать «Saturday» или «Sunday»: (?:(Sat)ur|(Sun))day
Но в одном случае обратная ссылка 1 заполняется, а обратная ссылка 2 пуста, а в другом случае наоборот.
PHP (pcre) обеспечивает хороший оператор «? |» что обходит эту проблему. Предыдущее регулярное выражение получило бы (?|(Sat)ur|(Sun))day
. Таким образом, не будет пустых обратных ссылок.
Есть ли эквивалент в C # или какой-нибудь обходной путь?
.NET не поддерживает оператор ветвления-сброса, но он поддерживает именованные группы и позволяет повторно использовать имена групп без ограничений (что-то не имеет другого вкуса, AFAIK). Поэтому вы можете использовать это:
(?:(?<abbr>Sat)ur|(?<abbr>Sun))day
… и сокращенное имя будет сохранено в Match.Groups["abbr"]
.
должны быть доступны для concre backref1 и backref2.
Поскольку каждый из них всегда пуст, а строка concat с пустым – это одна и та же строка …
с вашим регулярным выражением (?:(Sat)ur|(Sun))day
и замена $1$2
вы получаете Saturday
и Sunday
на Sunday
.
regex (? :( Sat) ur | (Солнце)) день вход | backref1 _ $ 1_ | backref2 _ $ 2_ | 'concat' _ $ 1 $ 2_ --------- | --------------- | --------------- | -------- -------- Суббота | «Сб» | '' | 'Sat' + '' = Sat Воскресенье | '' | «Солнце» | '' + 'Солнце' = Солнце
вместо чтения backref1 или backref2 просто прочитайте оба результата и сравните результат.
Вы можете использовать оператор сброса-сброса:
(?|foo(bar)|still(life)|(like)so)
Это установит только группу, независимо от того, какая ветка соответствует.