Сопоставить строку между указанным c словом и парными скобками после него с поддержкой одного вложенного уровня с исключением - PullRequest
1 голос
/ 23 апреля 2020

У меня проблема с соответствием регулярному выражению. Мне нужно найти указанную подстроку c в строке. Вот несколько примеров:

1. IF[A != B; C[0]; D] ==> IF[A != B; C[0]; D]
2. IF[A != B; IF[E < F; ...; ...]; D] ==> IF[E < F; ...; ...]
3. IF[A != B; C; D] ==> IF[A != B; C; D]

Итак, у меня есть это регулярное выражение: IF\[([^\[\]]*)\]. Он отлично работает в случаях 2 и 3, но в случае 1 есть C[0], который содержит квадратные скобки.

Я попытался изменить свое регулярное выражение следующим образом: IF\[((?!IF))\] и окончательно IF\[(.+(?!IF))\]. Я добавил взгляд вперед, чтобы сказать, что «оставьте IF, который не содержит другой IF». Теперь это работает в случаях 1 и 3, но в случае 2 возвращает всю строку.

Как создать правильную головку для решения этой проблемы? Мне нужно найти самый внутренний IF в строке, который может быть всей строкой.

Я уже попытался найти решение в этом ответе: { ссылка }

1 Ответ

1 голос
/ 23 апреля 2020

Вы хотите сопоставить подстроки IF[...], где строка между квадратными скобками может содержать другую пару квадратных скобок, если только перед ней не стоит IF, с одним уровнем вложенных скобок.

Для этого вы может использовать

IF\[([^][]*(?:(?<!\bIF)\[[^][]*][^][]*)*)]

См. демонстрационную версию regex

Подробности

  • IF\[ - IF[ подстрока
  • ([^][]*(?:(?<!\bIF)\[[^][]*][^][]*)*) - группа 1:
    • [^][]* - 0+ символов, отличных от [ и ]
    • (?:(?<!\bIF)\[[^][]*][^][]*)* - 0 или более вхождения
      • (?<!\bIF)\[ - символ [, которому непосредственно не предшествует целое слово IF (\b - граница слова)
      • [^][]* - 0+ символы, отличные от [ и ]
      • ] - ] char
      • [^][]* - 0+ символов, отличных от [ и ]
  • ] - ] char.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...