正则表达式:匹配到“,”,但如果“,”在括号内则不匹配

问题描述 投票:0回答:1

给出以下模式:

group1: hello, group2: world
group1: hello (hello, world) world, group2: world
group1: hello world

风格

<group_name>: <group_value>[, <group_name>: <group_value>[...]]

一般来说,我使用以下正则表达式来提取值:

group1:\s(?P<group1>[^,\n]+)(:?,\sgroup2:\s(?P<group2>[^,\n]+))?\n

该文件有效,除非

,
内存在
group_value
中。

我知道这个玩具示例可以通过以下方式解决:

group1:\s(?P<group1>.+?)(?:,\sgroup2:\s(?P<group2>.+?))?\n

但是我确实想保护自己不会意外匹配所有内容,所以当遇到

,
时我仍然想限制我的匹配。

问题:是否有一种(通用)方法可以匹配

,
,并为此目的忽略括号中的
,

regex pcre
1个回答
0
投票

使用 pcre,您可以利用递归模式来实现具有所有格量词的平衡括号。

您为组 1 定义模式,如果相同的逻辑适用于组 2,您可以递归组 1 中定义的子模式。

当您排除匹配否定字符类中的换行符时,您可以使用

\h
来匹配水平空白字符,而不是使用
\s

\bgroup1:\h+(?P<group1>(?:[^,\n()]*(?:(\((?:[^()\n]+|(?1))*+\)))?)*+)(?:,\h+group2:\h+(?P<group2>(\g<group1>)))?\R

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.