電子書籍の厳選無料作品が豊富!

rubyの正規表現で"["を使いたいのですが、正しく実行できません

#! ruby -Ks
a ="test[test"
b ="test["
if /#{b}/ =~ a
print "hit"
end

エラー内容は
test.rb:4: invalid regular expression; '[' can't be the last character ie. can't start range at the end of pattern: /test[/ (RegexpError)

"\["と文字を入力することで解決するかと思いましたが上手くいきませんでした。
rubyのバージョンは1.8.2です。宜しくお願いいたします。

A 回答 (2件)

b= を書き換えるなら#1の方の回答の通りですが、


if /test\[/ =~ a
と書かないということは、b は実際にはどこかから読み込んだデータが入っているわけですよね。
if /#{Regexp.escape(b)}/ =~ a
とすれば、bに含まれる正規表現記号を適切にエスケープして文字列そのままの正規表現にしてくれます。
もちろん、正規表現にせずに、単純に文字列が含まれるかと言うことなら、
if a.include?(b)
if a[b]
とか書きます。
    • good
    • 0
この回答へのお礼

Regexp.escape()を使って上手く行きました!
これで正規表現記号を処理できそうです。
ありがとうございました!

お礼日時:2010/05/26 23:22

「[」は正規表現で使われるメタ文字の一つですから、「[」という文字そのものとマッチさせるためには、正規表現では「\[」を指定する必要があります。

「test[」とマッチさせるためなら「test\[」と指定。

ですが、さらに、
ダブルクオートでくくられた文字列中では、「\」という文字そのものが、バックスラッシュ記法の文字として使われていますから、「\」という文字はダブルクオートでくくられた文字列中では「\\」と指定する必要があります。
ですので、「test\[」という文字列を指定するためには、
b="test\\["
とする必要があります。もしくは、シングルクオートで
b='test\['
と指定してもかまいません。
    • good
    • 0
この回答へのお礼

「\」という文字はダブルクオートでくくられた文字列中では「\\」と指定する必要があったんですね!
b='test\['という書き方で今後は対応していこうと思います!
ありがとうございました

お礼日時:2010/05/26 23:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!