正規表現での、括弧の中身のマッチング方法についてです。
目次
括弧を含めてマッチする正規表現
特定の文字で「(」で囲まれた「)」括弧の中身をマッチングしたいケースがあります。開始と終了の括弧を含めた文字列のマッチングはシンプルです。
// 括弧を含む文字列をマッチング
/(.*?)/
// 対象文字列
チャーシュー味噌ラーメン(豚骨変更できます)
// マッチする文字列
(豚骨変更できます)
ポイントは、最短マッチの「.*?」
「.*」は「.(改行以外の任意の文字)」の「*(0回以上の繰り返し)」を意味ます。「*?」と?を付け加えることで、最短の(non-greedy)マッチを見つけるようになる点に注意して下さい。
最短マッチは、こちらに詳しくまとめています。
括弧で囲まれた中身だけをマッチする正規表現
さて、開始と終了の括弧を除いて、括弧の中身の文字列だけをマッチする方法です。こちらに肯定先読み、肯定戻り読みを利用した正規表現を紹介します。
// 括弧の中身だけをマッチする正規表現
/(?<=\().*?(?=\))/
// 対象文字列
味玉しょうゆラーメン(トッピング選べます)
// マッチング文字列
トッピング選べます
一見、かなり複雑に見えてぎょっとしますが、分解して読むと意味が通ります。わかりやすさのために、デリミタを「#」、カッコを、全角の「【】」を使って書き直してみましょう。
// 括弧の中身だけをマッチする正規表現
#(?<=【).*?(?=】)#
もっと分解すると。
# (?<=【) .*? (?=】) #
先読み・戻り読みの言明(Assertion)は、その括弧の中でマッチした文字列をキャプチャしない、という振る舞いです。上記は、マッチした開始括弧、終了括弧を含めず、中身だけをマッチできる表現となります。
肯定先読みについてはこちらにまとめています。
半角の括弧はメタ文字として扱われてしまいますので、エスケープするようにして下さい。
プログラミング言語を使った中身の抽出
上記はやや難解なパターンに見えますし、あくまで基本的なケースにしか対応しません(「((二重括弧))」のような文字列はうまく対応できません)
プログラミング言語を使えば、よりシンプルに括弧の中身だけを取り出すことができるでしょう。下記はPHP(PCRE)の例です。
<?php
$ptn = '/\(.*?\)/';
$sbj = 'かけそば(うどん)のみ';
if ( preg_match( $ptn, $sbj, $matches ) ) {
$m = $matches[0]; // この時点では、(うどん)
$m = trim( $m, '()' );
echo $m; // うどん
}
※全角括弧/半角括弧を問わずマッチしたい場合
全角括弧を含めるのであれば、文字クラスの利用が便利でしょう。文字クラス内では括弧はエスケープ不要です。
// 括弧の中身をマッチする
/(?<=[((]).*?(?=[))])/
参考情報
先読み、後読みは、やや理解が難しいですが、便利なアンカーとして利用できます。
.(ドット)を含む量指定子はこちらにまとめています。
「.*」とすると、最長の(greedy)マッチなので、行の一番最後に見つかる閉じ括弧までをマッチしてしまうね・・・。