给出以下模式:
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
但是我确实想保护自己不会意外匹配所有内容,所以当遇到
,
时我仍然想限制我的匹配。
问题:是否有一种(通用)方法可以匹配
,
,并为此目的忽略括号中的,
?
使用 pcre,您可以利用递归模式来实现具有所有格量词的平衡括号。
您为组 1 定义模式,如果相同的逻辑适用于组 2,您可以递归组 1 中定义的子模式。
当您排除匹配否定字符类中的换行符时,您可以使用
\h
来匹配水平空白字符,而不是使用 \s
\bgroup1:\h+(?P<group1>(?:[^,\n()]*(?:(\((?:[^()\n]+|(?1))*+\)))?)*+)(?:,\h+group2:\h+(?P<group2>(\g<group1>)))?\R