Сопоставление нескольких спорадических групп в регулярном выражении

2

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

У меня возникают проблемы с тем, что формат содержит группы, которые могут повторяться много раз спорадически. Например, как правило, данные будут выглядеть аналогично этому (A) (B) (B) (B), но иногда он может иметь несколько (A), подобных этому (A) (B) (B) (B) (A) (B ) (B) или даже (A) (A) (B) (B) (B). Количество повторений (B) также может варьироваться, как ничто, или сколько угодно, лотов.

Что происходит с моим текущим регулярным выражением, отлично работает, когда данные выглядят как (A) (B) (B)... но он ломается, когда в строке добавляется другая (A). Первый (A) попадает, но все остальные (A) этого не делают.

Итак, в основном прямо сейчас у меня есть регулярное выражение, у которого есть группа для синтаксического анализа (A) и группа для синтаксического анализа (B), и эти группы работают нормально независимо, но я не могу понять, как их объединить с правильным повторением синтаксис между ними, чтобы найти рассеянные совпадения, а не только первый, а остальные игнорируются.

Я просто что-то пропустил или мне нужно разбить мое регулярное выражение на два отдельных и разобрать (A) и (B) отдельно? (Я использую С#/. Net)

Теги:

3 ответа

4
Лучший ответ

Если у вас есть рабочий шаблон, который соответствует (A), а другой, который соответствует (B), то выражение, соответствующее любому числу, равно

(?:(A)|(B))*

Нет необходимости получать фантазию, если это все, что вам нужно. Это выражение совпадает с любым числом (A) или (B), но оставляет захват групп до уровня A и B.

  • 0
    Это также будет соответствовать пустой строке. Знак * должен быть +, если это нежелательное поведение.
0

Я бы разместил каждую отдельную часть того, что вы хотите совместить в своих группах, положив | charachter. Затем я напишу функцию/метод, используя оператор switch. Таким образом, вы можете сопоставлять группы 1 или 2... и реагировать на разные результаты.

0

Это поможет увидеть текущее regexp.

Для соответствия любой последовательности A или B используйте

           (A*B*)*

То, что любое число групп из A, за которым следует любое число B

Это будет соответствовать пустой строке, чтобы убедиться, что есть хотя бы некоторые данные:

           (A|B)(A*B*)*

Или данные всегда начинаются с буквы A (как и во всех ваших примерах)

            A(A*B*)*   

Ещё вопросы

Сообщество Overcoder
Наверх
Меню