人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Rubyの正規表現について質問します。
対応する括弧を選択するような正規表現を書くことはできますか?

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


●質問者: yna1962
●カテゴリ:コンピュータ
✍キーワード:AAA CCC DD keyword Ruby
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● いわどん
●35ポイント

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

◎質問者からの返答

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


2 ● pahoo
●35ポイント

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

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

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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ