- ベストアンサー
Rubyの正規表現について教えてください
配列に文字列を格納し、先頭が大文字または数字の文字列だけ別の配列に入れようとしています。 次のようにプログラムを作ったのですが、ifの行でエラーが出ます。 何が間違ってますか? mojiretu_array.each{|mojiretu| if mojiretu =~ [^a-z]\w+ mojiretu_out.push mojiretu end }
- みんなの回答 (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].*/ と書くことになりますが、結局同じ意味です。
その他の回答 (1)
- kmee
- ベストアンサー率55% (1857/3366)
正規表現リテラルとして記述していないから。 http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html#regexp 文字列に例えるなら、''とかで括らずに記述したような状態になっているため、正規表現として解釈されていません。
お礼
回答ありがとうございます。 うまく動作しました。
お礼
回答ありがとうございます。 ご指摘のように修正したらうまく動作しました。