Можно ли сопоставить одну позицию регулярного выражения, но не другую (например, позиционную XOR)?

Я стремлюсь создать несколько подвыражений в большем регулярном выражении, где каждое подвыражение соответствует чему-то в одном месте на входе или в другом месте, но не в обоих местах, предпочтительно используя одну и ту же именованную группу для "области интереса". Например, я хотел бы сопоставить единицы объема, выделенные курсивом ниже, и единицы валюты, выделенные жирным шрифтом.

  • 3,23 долл. США / гал.
  • 3,23доллара США в галлонах
  • 4,50 CAD / галлон
  • 1 галлон @ 3,23 доллара
  • 10 галлонов@ 4,50 канадских долларов

Или в целом:

  • вещиеще
  • вещиXXX

гдевещи идругиевещи могут быть сложным набором подвыражений.

Кажется, что это может быть возможно с использованием некоторой комбинации

  • групповой стек push/pop
  • балансировочные группы
  • смотреть по сторонам

но я не уверен, как поступить. Это сводится к чередованию (|) или несколько проходов с разными выражениями (которые, я полагаю, равносильны одному и тому же)?

1 ответ

Решение

Вы, вероятно, должны использовать чередование, что-то вроде этого?

^(stuffmorestuff)XXX(yetmorestuff)|(stuff)XXX(morestuff)$

Но вы получите четыре группы захвата. Не уверен, как будет работать механизм регулярных выражений.NET, если вы используете одно и то же имя группы для нескольких групп.

Другие вопросы по тегам