【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

配列に文字列を格納し、先頭が大文字または数字の文字列だけ別の配列に入れようとしています。
次のようにプログラムを作ったのですが、ifの行でエラーが出ます。
何が間違ってますか?
mojiretu_array.each{|mojiretu|

if mojiretu =~ [^a-z]\w+
mojiretu_out.push mojiretu
end
}

A 回答 (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].*/

と書くことになりますが、結局同じ意味です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/12/20 07:33

正規表現リテラルとして記述していないから。


http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2flit …

文字列に例えるなら、''とかで括らずに記述したような状態になっているため、正規表現として解釈されていません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/12/20 07:31

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