Что эквивалентно оператору сброса ветвей («? |»), Найденному в php (pcre) в C #?

Следующее регулярное выражение будет соответствовать «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) 

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