• ベストアンサー

Rubyの正規表現について教えてください

配列に文字列を格納し、先頭が大文字または数字の文字列だけ別の配列に入れようとしています。 次のようにプログラムを作ったのですが、ifの行でエラーが出ます。 何が間違ってますか? mojiretu_array.each{|mojiretu| if mojiretu =~ [^a-z]\w+ mojiretu_out.push mojiretu end }

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.2

間違いが2つあります。(考え方を含めたら3つ) ・正規表現は、スラッシュで囲んでください。 ・\w などの文字集合メタキャラクタは、単に「[文字集合]」と書くことの略記方です。 ですから、「[^a-z]\w+」という正規表現は、「[^a-z][A-Za-z0-9_]+」と書いているのと同じことです。 おそらく、「[A-Za-z0-9_]から[a-z]を抜いた物」というつもりで書かれたのでしょうが、上記のように展開・解釈されますから、あなたの考えたとおりには動きません。 (「[^a-z]\w+」は結局、「先頭がa~z以外で、英数字が続いたもの」という意味になります。) 素直に if mojiretu =~ /^[A-Z0-9]/ と書いてみてください。 上記は、最初の ^ で「先頭」を表し、次の[A-Z0-9]で、「英大文字または数字のいずれか1字」にマッチします。 合わせると、「1文字目が英大文字または数字」という部分だけ、チェックしているわけです。 2文字目以降は、英小文字でも数字・記号・空白類があっても構わない訳ですから、マッチさせる必要がありませんよね? もし行末までマッチさせるなら、 if mojiretu =~ /^[A-Z0-9].*/ と書くことになりますが、結局同じ意味です。

kihonkana
質問者

お礼

回答ありがとうございます。 ご指摘のように修正したらうまく動作しました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

正規表現リテラルとして記述していないから。 http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html#regexp 文字列に例えるなら、''とかで括らずに記述したような状態になっているため、正規表現として解釈されていません。

kihonkana
質問者

お礼

回答ありがとうございます。 うまく動作しました。

関連するQ&A