2012-03-12 24 views
1

は、入力として、私は次のことを持っていると言う:除き、個々のキーワードを区切る正規表現オプションの非正規表現のグループのマッチ

  1. すべてカンマ:ここ

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

    は、ルールは私が取得しようとしていますされています#2が真のとき。

  2. 丸括弧の間にカンマは効果がありません。
    • すべての丸括弧はキーワードを1つのキーワードとしてグループ化します。

私は今、次の正規表現があります

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

私はこのような結果に終わる:

Tonic 
Love 
(Original 
Mix) 
house 
dance 

それは私を除いて、カンマで分割と同じです最後のキーワードton!cが失われました。私はこれをすべて1つの正規表現で行う必要はないが、それが望ましい。

+0

最後の値を失わないために、regexpの最後のカンマを '、| $'に置き換えます。 – kirilloid

+0

#2に基づいて1つのキーワードにする必要があるので、あなたも失われていませんか(オリジナル、ミックス)? – Kash

答えて

2

この単純なもの:\([^\)]*\)|[^,]*が動作するはずです。

+0

これは私が必要とする(ほぼ)正確に動作します。私が変更したのは、空のマッチを削除する最後の '* 'と' + 'だけでした。 –

1

あなたは上で分割できます。

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

かですべてに一致:

少なくともあなたの例については、

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

すなわち:

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

これは、一度にすべてのグループをキャッチ

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

を試してみてください。