给出以下模式:
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
然而,我确实想保护自己,防止意外匹配所有内容,所以我仍然想在遇到,
.
问题:是否有一种(通用)方法可以匹配,
并为此目的忽略,
括号中的 s?
使用 pcre,您可以利用递归模式来平衡括号和所有格量词。
您为组 1 定义模式,如果相同的逻辑适用于组 2,您可以递归组 1 中定义的子模式。
当您排除匹配否定字符类中的换行符时,您可以使用
\h
匹配水平空白字符而不是使用\s
\bgroup1:\h+
匹配单词 group1 和 then:
以及 1+ 个水平空白字符(?P<group1>
命名组1(?:
非捕获组[^,\n()]*
匹配除,
换行符(
或以外的可选字符)
(?:
非捕获组(\((?:[^()\n]+|(?2))*+\))
匹配平衡括号递归组 2)?
关闭组并使其可选)*+
关闭组并可选择使用所有格量词重复(无回溯))
关闭组1(?:
非捕获组,\h+group2:\h+
匹配组2:水平空白字符之间(?P<group2>\g<group1>)
命名为group2 ,递归命名为group1中的子模式)?
关闭非捕获组并使其可选\R
匹配换行符正则表达式演示