用正则表达式提取内部组

时间:2016-02-19 10:27:28

标签: regex regex-group repeat

我有以下字符串

([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)

当括号内只有一组字符串时,很容易提取它,但是当给出上面的例子时,我的正则表达式会捕获整个字符串。 我正在使用的正则表达式是

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

1 个答案:

答案 0 :(得分:1)

您似乎只想匹配()之间不是()的内容,除非它们是(...)之前是一个单词字符。

您可以使用

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

请参阅regex demo

正则表达式分解:

  • \( - 匹配文字(
  • (?:[^()]|\b\([^()]*\))* - 零个或多个序列:
    • [^()] - ()
    • 以外的任何字符
    • | - 或......
    • \b\([^()]*\) - 一个单词边界(即在该位置之前,必须有一个单词字符),然后是(,后面跟着(和{{1}以外的零个或多个字符}
  • ) - 结束\)

替代模式可以是展开的模式(使用更长的输入更有效):

)

请参阅another demo