正则表达式可选非正则表达式组匹配

时间:2012-03-12 16:48:48

标签: php regex csv

说我有以下内容,作为输入:

Tonic,Love,(Original,Mix),house,dance,ton!c

以下是我想要的规则:

  1. 所有逗号分隔单个关键字,除非#2为真。
  2. 逗号在圆括号之间没有效果。
    • 所有圆括号将关键字组合为一个关键字。
  3. 我现在有以下正则表达式:

    #([\(?.*?\)])|(.*?),#
    

    我最终得到的结果如下:

    Tonic
    Love
    (Original
    Mix)
    house
    dance
    

    除了我丢失了最后一个关键字ton!c之外,它与用逗号分割相同。我并不要求所有这一切都发生在一个正则表达式中,但它是首选。

3 个答案:

答案 0 :(得分:2)

这个简单的:\([^\)]*\)|[^,]*应该有用。

答案 1 :(得分:1)

你可以分开:

/,(?![^(]*\))/

或全部匹配:

/\([^)]*\)|[^,()]*/

至少对你的例子而言。

即:

$array = preg_split('/,(?![^(]*\))/', $string);

答案 2 :(得分:0)

尝试

"(\([^)]+\))|([^(][^,]*)(,(\([^)]+\))|([^(][^,]*))*"

这会立即捕获所有群组。