対応する括弧を選択するような正規表現を書くことはできますか?
"aaa bbb ccc keyword(123,123*(1+1),123*(2*(1+2)),2) aaa bbb dd"
上記のような文字列がある場合、keywordの直後の開きカッコから対応する括弧までを選択するような正規表現はどうやって書いたらいいのでしょうか?(カッコのネストは何段になるか分かりません)
基本的には入れ子の括弧にマッチする正規表現は書けないと思います。Perlでは再帰を使って書けるようですが、Ruby 1.8.xでは対応していません。
ただし、Ruby 1.9や、鬼車を使ったRuby 1.8であれば、以下のようにできます。
re = /keyword(?<pare>\(([^\(\)]++|\g<pare>)*+\))/i "()keyword((keyword())())()".scan(re) # => [["((keyword())())"]]
わかりづらいですが、keyword直後の括弧のみを取り出せています。また、必要であれば取り出した文字列を再度マッチさせればkeywordの入れ子にも対応できると思います。
なお、鬼車を使った正規表現はruby-listの以下の記事を元にしました。
括弧以外に含まれる文字セットが英数字,四則計算記号,カンマ,スペースだとすると、以下のような感じでしょうか。
/^[0-9|a-z| \,+\-\*\/]*\(([0-9|a-z| \,+\-\*\/\(\)]*)\)[0-9|a-z| \,+\-\*\/]*$/i
これだと、一番外側(第一階層)が1グループのみの場合の抽出となります。
一般に第N階層が複数あり、それらを逐次抽出するという条件だと、もう一工夫必要です。
この正規表現で、多重ネストに対応しているのでしょうか?
1.8.xなので、ちょっと難しそうですね。ありがとうございました。