用于获取括号内多个字符串的正则表达式
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 组:
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 ) )
几天来我一直在安静地尝试它,并想出了这个正则表达式:
(?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
您的匹配项在 已捕获组 #1
中可用
正则表达式详细信息:
(?: ^data | (?!^)\G )
:在一行中以 data
开头,否则从上一场比赛的结尾开始比赛,即 \G
\h+
:匹配 1+ 个空格
(
: 开始捕获组 #1
\w+
:匹配1+个单词字符
\h*
: 匹配 0+ 个空格
(
: 开始捕获组 #2
\(
:匹配文字(
(开)
(?:
: 开始non-capture组
[^()]*+
:匹配0个或多个非(
和)
的字符
|
: 或
(?-1)
:递归与最新组的匹配,即#2
)*
: 结束non-capture组。匹配该组中的 0 个或多个
)
:捕获组 #2
)
:捕获组 #1
我不是专家,但我会选择很多简单的选项
foo = ‘(foo.+?)bar’
bar = ‘(bar.+);’
#or combine both
‘(bar.+);|(foo.+?)bar’
如何匹配以下字符串中 () 之间的 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 组:
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 ) )
几天来我一直在安静地尝试它,并想出了这个正则表达式:
(?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
您的匹配项在 已捕获组 #1
中可用正则表达式详细信息:
(?: ^data | (?!^)\G )
:在一行中以data
开头,否则从上一场比赛的结尾开始比赛,即\G
\h+
:匹配 1+ 个空格(
: 开始捕获组 #1\w+
:匹配1+个单词字符\h*
: 匹配 0+ 个空格(
: 开始捕获组 #2\(
:匹配文字(
(开)(?:
: 开始non-capture组[^()]*+
:匹配0个或多个非(
和)
的字符
|
: 或(?-1)
:递归与最新组的匹配,即#2
)*
: 结束non-capture组。匹配该组中的 0 个或多个
)
:捕获组 #2
)
:捕获组 #1
我不是专家,但我会选择很多简单的选项
foo = ‘(foo.+?)bar’
bar = ‘(bar.+);’
#or combine both
‘(bar.+);|(foo.+?)bar’