我正在尝试编写一个正则表达式,它将捕获单词“和”两侧逗号分隔列表中的项目。当项目看起来像item (sub item 1, sub item 2) and other item, ...
时,它会变得复杂。当前面的例子是其他东西的子项时,情况变得更糟。我现在的正则表达式是/([^,]*(?:\(.*\))?[^,]*)( and )([^,]*(?:\(.*\))?[^,]*)/i
,但它无法正常工作。
答案 0 :(得分:1)
不要使用单个正则表达式。一次提取零件。首先在单词and
这会给你x个数组(在你的情况下为2)
然后在该数组中,您有一个可以包含0个以上子项的项目
preg_match('#\((.*?)\)#', $item, $match);
然后你可以处理$ match [1](在逗号上爆炸),从字符串中删除括号,你只剩下一个项目
我不是100%确定您想要以什么样的数据结构结束。但是在这里使用正则表达式+ 2爆炸后你应该能够处理所有
您可能也希望使用trim
答案 1 :(得分:0)
您可以将这些子字符串与以下正则表达式匹配:
(?<=^|,)
(?<before>[^,]*?
(?:
(\((?>[^()]+|(?2))*\))
[^,]*
)*
)
\s+and\s*
(?<after>[^,]*?
(?:
(\((?>[^()]+|(?4))*\))
[^,]*
)*
)
(?=,|$)
请参阅demo
before
和after
是部分(\((?>[^()]+|(?2))*\))
和(\((?>[^()]+|(?4))*\))
子模式是与嵌套括号匹配的子程序。
(?<=^|,)(?<before>[^,]*?(?:(\((?>[^()]+|(?2))*\))[^,]*)*)\s+and\s*(?<after>[^,]*?(?:(\((?>[^()]+|(?4))*\))[^,]*)*)(?=,|$)