Rubyの正規表現について質問します。

対応する括弧を選択するような正規表現を書くことはできますか?

"aaa bbb ccc keyword(123,123*(1+1),123*(2*(1+2)),2) aaa bbb dd"
上記のような文字列がある場合、keywordの直後の開きカッコから対応する括弧までを選択するような正規表現はどうやって書いたらいいのでしょうか?(カッコのネストは何段になるか分かりません)

回答の条件
  • 1人2回まで
  • 登録:2008/04/16 10:36:45
  • 終了:2008/04/17 00:21:52

回答(2件)

id:iwadon No.1

いわどん回答回数60ベストアンサー獲得回数132008/04/16 11:59:50

ポイント35pt

基本的には入れ子の括弧にマッチする正規表現は書けないと思います。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の以下の記事を元にしました。

id:yna1962

1.8.xなので、ちょっと難しそうですね。ありがとうございました。

2008/04/16 18:51:47
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/04/16 13:50:20

ポイント35pt

括弧以外に含まれる文字セットが英数字,四則計算記号,カンマ,スペースだとすると、以下のような感じでしょうか。

/^[0-9|a-z| \,+\-\*\/]*\(([0-9|a-z| \,+\-\*\/\(\)]*)\)[0-9|a-z| \,+\-\*\/]*$/i

これだと、一番外側(第一階層)が1グループのみの場合の抽出となります。

一般に第N階層が複数あり、それらを逐次抽出するという条件だと、もう一工夫必要です。

id:yna1962

この正規表現で、多重ネストに対応しているのでしょうか?

2008/04/16 19:24:07

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません