正規表現:括弧の中身だけをマッチする表現

最終更新:2018-12-08 by Joe

正規表現での、括弧の中身のマッチング方法についてです。

括弧を含めてマッチする正規表現

特定の文字で「(」で囲まれた「)」括弧の中身をマッチングしたいケースがあります。開始と終了の括弧を含めた文字列のマッチングはシンプルです。

// 括弧を含む文字列をマッチング
/(.*?)/

// 対象文字列
チャーシュー味噌ラーメン(豚骨変更できます)

// マッチする文字列
(豚骨変更できます)

ポイントは、最短マッチの「.*?」

「.*」は「.(改行以外の任意の文字)」の「*(0回以上の繰り返し)」を意味ます。「*?」と?を付け加えることで、最短の(non-greedy)マッチを見つけるようになる点に注意して下さい。

最短マッチは、こちらに詳しくまとめています。

「.*」とすると、最長の(greedy)マッチなので、行の一番最後に見つかる閉じ括弧までをマッチしてしまうね・・・。

括弧で囲まれた中身だけをマッチする正規表現

さて、開始と終了の括弧を除いて、括弧の中身の文字列だけをマッチする方法です。こちらに肯定先読み、肯定戻り読みを利用した正規表現を紹介します。

// 括弧の中身だけをマッチする正規表現
/(?<=\().*?(?=\))/

// 対象文字列
味玉しょうゆラーメン(トッピング選べます)

// マッチング文字列
トッピング選べます

 

一見、かなり複雑に見えてぎょっとしますが、分解して読むと意味が通ります。わかりやすさのために、デリミタを「#」、カッコを、全角の「【】」を使って書き直してみましょう。

// 括弧の中身だけをマッチする正規表現
#(?<=【).*?(?=】)#

もっと分解すると。

#        (?<=【)        .*?        (?=】)        #

先読み・戻り読みの言明(Assertion)は、その括弧の中でマッチした文字列をキャプチャしない、という振る舞いです。上記は、マッチした開始括弧、終了括弧を含めず、中身だけをマッチできる表現となります。

肯定先読みについてはこちらにまとめています。

半角の括弧はメタ文字として扱われてしまいますので、エスケープするようにして下さい。

プログラミング言語を使った中身の抽出

上記はやや難解なパターンに見えますし、あくまで基本的なケースにしか対応しません(「((二重括弧))」のような文字列はうまく対応できません)

プログラミング言語を使えば、よりシンプルに括弧の中身だけを取り出すことができるでしょう。下記はPHP(PCRE)の例です。

<?php


$ptn = '/\(.*?\)/';
$sbj = 'かけそば(うどん)のみ';

if ( preg_match( $ptn, $sbj, $matches ) ) {

  $m = $matches[0];  // この時点では、(うどん)

  $m = trim( $m, '()' );

  echo $m; // うどん

}

※全角括弧/半角括弧を問わずマッチしたい場合

全角括弧を含めるのであれば、文字クラスの利用が便利でしょう。文字クラス内では括弧はエスケープ不要です。

// 括弧の中身をマッチする
/(?<=[((]).*?(?=[))])/

参考情報

先読み、後読みは、やや理解が難しいですが、便利なアンカーとして利用できます。

.(ドット)を含む量指定子はこちらにまとめています。