Table of Contents
テキストエディタ内のテキストや、プログラム(スクリプト)などで特定の文字で囲まれた部分だけを選択・抽出するための正規表現の使い方についてです。
この記事では、正規表現をテキストエディタ「Sublime Text 3」で使用して、その動作を解説しますが、他のエディタやプログラムでも同様の正規表現が使えます。
全角括弧で囲まれた部分だけを抽出する正規表現
例えば、以下のような文章があるとします。
そうよ。冷蔵庫内の温度(おんど)が上がると、急(いそ)いで冷やそうとしてコンプレッサーがフル稼働(かどう)するの。
冷蔵庫の心臓部分(しんぞうぶぶん)だから、故障(こしょう)につながりやすいのよ。
冷蔵庫の音(おと)や振動(しんどう)が大きくなると、コンプレッサーに負担がかかっているというサインだから気をつけてね。
冷蔵庫はなぜ冷える? 朝日新聞社 NIE -教育に新聞を- 新聞出前授業
この文章の中にある、全角括弧で囲まれた部分(括弧を含む)を選択する正規表現を考えてみます。
選択したい部分は、全角の開始括弧「(」で始まり、全角の閉じ括弧「)」で終わり、その間の文字については条件はありません。
したがって、以下のような正規表現が使えるのではないか…と考えられます。
(.*)
.* は「0文字以上のすべての文字列」を表す正規表現です。これが全角括弧で囲まれている部分に一致します。
実際にこの正規表現を使ってみると、マッチする部分は以下のようになります。
確かに全角括弧に囲まれた部分は選択されていますが、意図したような選択ではありません。これは、最初の閉じ括弧ではなく、文の最後に見つかる閉じ括弧にマッチしてしまっているためです。
そこで、最初の閉じ括弧を検出したら、そこで選択部分が終了するような指示が必要になります。これを実現するには、以下の2つの方法があります。
方法1 閉じ括弧以外にマッチするようにする
先ほどの正規表現の .* は、閉じ括弧を含むすべての文字にマッチしました。
これを閉じ括弧にはマッチしないように変更すれば、閉じカッコの直前でマッチ部分を終了させることができます。
正規表現で「ある文字以外にマッチさせる」を実現するには、以下の表現を使います。
[^C]
ここで C は任意の文字です。C をマッチさせたくない文字に変更してください。例えば「あ」以外にマッチさせる場合は以下のようにします。
[^あ]
これを使って、閉じ括弧以外にマッチするようにした正規表現は以下のようになります。
([^)]*)
[^)]* は「) 以外の0文字以上の文章にマッチ」という意味になります。この表現自体には、括弧を選択する効果がありませんので、括弧を左右につける必要があります。
実際にこれを使ってみると、全角括弧で囲まれた部分だけを選択することができます。
方法2 クエスチョンマークを使う
正規表現におけるクエスチョンマーク(?)には「直前のパターンが0回または1回出現する場合」にマッチさせることができます。
したがって以下のように書くと、最短マッチとなります。
(.*?)
実際にこの正規表現を使ってみると、全角括弧で囲まれた部分だけを選択することができます。
この正規表現によって ? の直前のパターンである .* が1回だけ出現する部分のみを選択できます。
半角括弧で囲まれた部分だけを抽出する正規表現
半角の括弧の場合は、少し注意が必要です。
半角の括弧は、正規表現において意味のある文字(メタ文字)であるため、そのまま書いても正規表現の文法の一部とみなされてしまいます。
したがって、ただの文字として扱いたい場合は、直前にバックスラッシュ(\)が必要になります。これをエスケープと呼びます。
例えば、上記の文章の全角括弧をすべて半角括弧に変えた文章で、半角括弧に囲まれた部分を選択するには、以下のような正規表現を使います。
\([^\)]*\)
または
\(.*?\)
結果は以下のようになります。
括弧を除いた中身だけを選択する正規表現
括弧で囲まれた文字列を、括弧は除いて選択したいという場合は、肯定的先読み (?=○○○) および肯定的後読み (?<=○○○) を用いて以下のように記述します。
(?<=\()[^\(\)]+(?=\))
結果は以下のようになります。括弧の中身だけを選択することができています。
以上、括弧で囲まれた部分だけを抽出する正規表現についてでした。パターンの左右の括弧を別の文字に変更すれば、括弧以外で囲まれた部分を選択する正規表現として使用できます。
ピンバック: [javascript] 正規表現で文字列の検索や置換を行うメソッド | JoyPlotドキュメント