用于获取括号内多个字符串的正则表达式

Regex for fetching multiple strings within brackets

如何匹配以下字符串中 () 之间的 2 个不同组

data foo (drop = DISCOUNT price RENAME = ( PROV_NM1= PROV_NM PROV_ST_NM1 = PROV_ST_NM) where = ( product = 'whizmo' and product < 10 )) bar( drop= DISCOUNT price rename= ( startDate = beginDate ) );

我需要匹配这个以获得 2 组:

  1. foo (drop = DISCOUNT price RENAME = ( PROV_NM1= PROV_NM PROV_ST_NM1 = PROV_ST_NM) where = ( product = 'whizmo' and product < 10 ))
  2. bar( drop= DISCOUNT price rename= ( startDate = beginDate ) )

几天来我一直在安静地尝试它,并想出了这个正则表达式: (?i)(data)\s+((\w+)(?=(\s*))(?:\w+))?\s*(\(((.|\n)*?)\);)? 可以在这里看到:regex demo

它适用于大多数情况,但在上述示例的情况下不会给出 2 个单独的组,因为它匹配单个组中括号内的所有内容。

我也尝试了一些递归模式,但遗憾的是无法弄清楚。对此的任何帮助或指导表示赞赏。谢谢。

这最多处理 1 级括号输入的嵌套:

\w+\s*\((?:\([^)]+\)|[^)])*?\)

参见live demo

它匹配后跟括号输入的单词,但包含交替 在尝试 non-closing 括号的更简单匹配之前优先使用外括号内的内括号输入。

在 PCRE 中,您可以使用此递归正则表达式来捕获您想要的内容:

~(?: ^data | (?!^)\G ) \h+ ( \w+ \h* ( \( (?: [^()]*+ | (?-1) )* \) ) )~xi

RegEx Demo

您的匹配项在 已捕获组 #1

中可用

正则表达式详细信息:

  • (?: ^data | (?!^)\G ):在一行中以 data 开头,否则从上一场比赛的结尾开始比赛,即 \G
  • \h+:匹配 1+ 个空格
  • (: 开始捕获组 #1
    • \w+:匹配1+个单词字符
    • \h*: 匹配 0+ 个空格
    • (: 开始捕获组 #2
      • \(:匹配文字((开)
      • (?:: 开始non-capture组
        • [^()]*+:匹配0个或多个非()
        • 的字符
        • |: 或
        • (?-1):递归与最新组的匹配,即#2
      • )*: 结束non-capture组。匹配该组中的 0 个或多个
    • ):捕获组 #2
  • ):捕获组 #1

参考: RegEx Expression Recursion

我不是专家,但我会选择很多简单的选项

foo = ‘(foo.+?)bar’
bar = ‘(bar.+);’

#or combine both 

‘(bar.+);|(foo.+?)bar’