无法弄清楚正则表达式

时间:2015-09-03 17:15:02

标签: php regex

我正在尝试编写一个正则表达式,它将捕获单词“和”两侧逗号分隔列表中的项目。当项目看起来像item (sub item 1, sub item 2) and other item, ...时,它会变得复杂。当前面的例子是其他东西的子项时,情况变得更糟。我现在的正则表达式是/([^,]*(?:\(.*\))?[^,]*)( and )([^,]*(?:\(.*\))?[^,]*)/i,但它无法正常工作。

2 个答案:

答案 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

beforeafter是部分(\((?>[^()]+|(?2))*\))(\((?>[^()]+|(?4))*\))子模式是与嵌套括号匹配的子程序。

One-liner

(?<=^|,)(?<before>[^,]*?(?:(\((?>[^()]+|(?2))*\))[^,]*)*)\s+and\s*(?<after>[^,]*?(?:(\((?>[^()]+|(?4))*\))[^,]*)*)(?=,|$)