雑感等

音楽,数学,語学,その他に関するメモを記す.

丸かっこで囲まれた部分以外にマッチする正規表現

丸かっこで囲まれた部分以外にマッチする正規表現

[^\(\)]+(?=\([^\(\)]+\))|[^\(\)]+$|^[^\(\)]+

テキストエディタMeryで動作確認済み。

説明

この正規表現は、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だけにマッチしてほしい」という事。

さて、GHを見ていく。

Gは上で見た[^\(\)]+と全く同じだ。 つまり、「丸括弧以外の文字が1文字以上連続する」パターンを表す。

次、H\([^\(\)]+\)は、さらに3つの要素に分解できて、 \( [^\(\)]+ \)となる。

\(は開き括弧、 [^\(\)]+は「丸括弧以外の文字が1文字以上連続する」パターン、 \)は閉じ括弧。

Hはつまり、「丸括弧で囲まれた文字列(ただし囲んでいる丸括弧も含む)」パターンを表す。

つまり[^\(\)]+ (?= \([^\(\)]+\) )は、 「丸括弧で囲まれた文字列の直前にある、丸括弧以外の文字列」のパターンを表す。

例えば入力が「)abcd(efgh)0123(4567)ijkl」なら、「abcd」と「0123」にマッチする。

参照

https://ja.stackoverflow.com/questions/9024/%E3%81%8B%E3%81%A3%E3%81%93%E3%81%A7%E5%9B%B2%E3%81%BE%E3%82%8C%E3%81%9F%E6%96%87%E5%AD%97%E4%BB%A5%E5%A4%96%E3%82%92%E3%83%9E%E3%83%83%E3%83%81%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84

https://qiita.com/shotets/items/98f3828b6e5f08d42498