丸かっこで囲まれた部分以外にマッチする正規表現
[^\(\)]+(?=\([^\(\)]+\))|[^\(\)]+$|^[^\(\)]+
説明
この正規表現は、orを意味するパイプ記号"|"と、3つの部分(下記ABC)で構成されている。
A | B | C
↓
[^\(\)]+(?=\([^\(\)]+\)) | [^\(\)]+$ | ^[^\(\)]+
つまり、「AまたはBまたはC」のパターンを表す。
まず、比較的単純なBから見る:[^\(\)]+$
これは、さらに3つの要素に分けられる。
D E F
↓
[^\(\)] + $
最初の角括弧[]は、「指定した文字を含まない」という意味の表現:[^~~~~]だ。
"[^"と"]"に挟まれた各文字以外の文字にマッチする。ここでいう各文字は \( と \)だ。エスケープされているが要は丸括弧"("または")"を意味する。
つまり、[^\(\)]は「丸括弧でない何らかの1文字」を意味する。
次、+は「前の文字が1文字以上連続する」を意味する。
次、$は、「行末」を意味する。
ここまで合わせて考えると[^\(\)]+$は「丸括弧以外の文字が1文字以上連続し、その直後に行末が来る」パターンを表す。
簡単に言うと、「丸括弧から行末までの文字 ※丸括弧は含まず」にマッチする。
例えば入力が「abc0123(hijk」なら、「hijk」にマッチする。
次にC:^[^\(\)]+を見る。
最初の^は、「行頭」を表す。※"[^"の"^"とは意味が異なる。
次は上で見た、[^\(\)]+と全く同じだ。
つまり、^[^\(\)]+は「行頭の直後に、丸括弧以外の文字が1文字以上連続する」パターンを表す。
簡単に言うと、「行頭から丸括弧までの文字 ※丸括弧は含まず」にマッチする。
例えば入力が「abc0123(hijk」なら、「abc0123」にマッチする。
最後にA:[^\(\)]+(?=\([^\(\)]+\))を見る。
まず、大枠は
G (?= H )
↓
[^\(\)]+ (?= \([^\(\)]+\) )
G (?= H ) のパターンは、肯定先読みと呼ばれる。
意味は、「G。ただし、Hが直後にあるもの」のパターンを表す。
「マッチしてほしいのはGだけど、Gならなんでもいいわけじゃなくて、Hの直前にあるGだけにマッチしてほしい」という事。
さて、GとHを見ていく。
Gは上で見た[^\(\)]+と全く同じだ。 つまり、「丸括弧以外の文字が1文字以上連続する」パターンを表す。
次、H: \([^\(\)]+\)は、さらに3つの要素に分解できて、 \( [^\(\)]+ \)となる。
\(は開き括弧、 [^\(\)]+は「丸括弧以外の文字が1文字以上連続する」パターン、 \)は閉じ括弧。
Hはつまり、「丸括弧で囲まれた文字列(ただし囲んでいる丸括弧も含む)」パターンを表す。
つまり[^\(\)]+ (?= \([^\(\)]+\) )は、 「丸括弧で囲まれた文字列の直前にある、丸括弧以外の文字列」のパターンを表す。
例えば入力が「)abcd(efgh)0123(4567)ijkl」なら、「abcd」と「0123」にマッチする。