Извлечение внутренних групп с помощью регулярных выражений

У меня есть следующая строка

([Valor][Corr][Fat]: 6M UC x Viz. Lógicos IN('3','6')) AND (((SUM_RevisionAnomalia_UltRevision_1M = 1) AND (CANT_ConsumoFact_UltRevision_1M > 1))   OR ((SUM_RevisionNoAnomalia_UltRevision_1M + 1) AND (CANT_ConsumoFact_UltRevision_1M BETWEEN 1 - 2))) OR (SUM_RevisionNoAnomalia_UltRevision_1M <= 1)

и я пытаюсь извлечь все внутренние группы, поэтому мой ответ должен содержать

([Valor][Corr][Fat]: 6M UC x Viz. Lógicos IN('3','6'))
(SUM_RevisionAnomalia_UltRevision_1M = 1)
(CANT_ConsumoFact_UltRevision_1M > 1)
(SUM_RevisionNoAnomalia_UltRevision_1M + 1)
(CANT_ConsumoFact_UltRevision_1M BETWEEN 1 - 2)
(SUM_RevisionNoAnomalia_UltRevision_1M <= 1)

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

/(\([a-zA-Z0-9\[\]:_+=-\s\.\(\),'óáéíúüçãôàäê><]+\))/g

person Konstantinos Papakonstantinou    schedule 19.02.2016    source источник
comment
Означает ли это, что вы просто сопоставляете то, что находится между ( и ), что не является ( и ), если только это не (...), которым предшествует символ слова? Попробуйте /\((?:[^()]|\b\([^()]*\))*\)/g   -  person Wiktor Stribiżew    schedule 19.02.2016
comment
классно! ваше регулярное выражение фиксирует то, что я хотел.... все те строки в круглых скобках, которые находятся между операторами, пожалуйста, опубликуйте ответ, чтобы принять его   -  person Konstantinos Papakonstantinou    schedule 19.02.2016


Ответы (1)


Кажется, вы просто хотите сопоставить то, что находится между ( и ), что не является ( и ), если только это не (...), которым предшествует символ слова.

Вы можете использовать

\((?:[^()]|\b\([^()]*\))*\)

См. демонстрацию регулярного выражения.

Разбивка регулярного выражения:

  • \( - соответствует буквальному (
  • (?:[^()]|\b\([^()]*\))* - zero or more sequences of:
    • [^()] - any character other than ( and )
    • | - or...
    • \b\([^()]*\) - граница слова (т.е. перед этой позицией должен быть символ слова), за которым следует (, за которым следует ноль или более символов, отличных от ( и )
  • \) - закрытие )

Альтернативный шаблон может быть развернутым (более эффективным при более длинных входных данных):

\([^()]*(?:\b\([^()]*\)[^()]*)*\)

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

person Wiktor Stribiżew    schedule 19.02.2016
comment
Посмотрите разницу между двумя шаблонами: 1) 552 против 2) 62 шагов. Я бы предложил использовать развернутую версию. - person Wiktor Stribiżew; 19.02.2016
comment
Привет, Виктор, в тексте, аналогичном приведенному выше, ([Prop]: Situação da UC = 'Ativo') AND ([Qtd][Apont][Fat]: 3M Casa Vazia = 0) AND ([Qtd] [Ocorr][Insp][Fat]: 12M - Inspeções = 0) И ([Qtd][Apont][Fat]: UC desligada, demolida ou desabitada (InelegÃvel) - 6M = 0) регулярное выражение не улавливает последняя строка, не могли бы вы изменить свое регулярное выражение, если у вас есть время. - person Konstantinos Papakonstantinou; 19.02.2016