質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1648閲覧

Rubyでの正規表現について

sika_boze

総合スコア15

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2015/09/25 07:09

編集2015/09/25 08:03

標準入力で改行のみのときに終了判定を行うプログラムを書こうとしています。
そのときに以下のコードでは上が成功、下が標準入力が終了せずうまくいきません
(str : 標準入力が入る変数)

Ruby

1if str == "\n" 2if str == /\n/

どなたかわかるかたがいれば教えてください!

※具体的にはこんな感じで使用しています。
while str = gets
break if str == "\n"
input_arr << str.chomp.split(/\s/)
end

またでおすすめの終了判定方法があればお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

正規表現の使い方については、maisumakunさんのご回答の通りです。

そして gets で取得した文字列には全て改行がついてしまうので、「改行を含んでいたら」という条件にしてしまうと一行目で終了してしまいます・・・

なので、このようにした方が良いかもしれません。

Ruby

1while (str = gets.chomp) != "" 2 input_arr << str.split(/\s/) 3end

入力が空行でない間繰り返すという意味です。

投稿2015/09/25 11:39

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sika_boze

2015/09/25 15:28

ご回答ありがとうございます。 たしかに「改行を含んでいたら」という条件は良くないようですね。 コードを参考にさせていただきます! もし以下のコードにおいて「〜の観点からこっちのほうがいい」などがあれば教えていただけるとありがたいです。 while (str = gets.chomp) != "" input_arr << str.split(/\s/) end while (str = gets) != "\n" input_arr << str.chomp.split(/\s/) end
pi-chan

2015/09/25 18:32

プログラムの「動作」としてはどちらも同じなので、ある意味「好み」の問題ですが、「意味」的には前者が良いと私は考えます。というのは… コンソールから入力された文字列が「abc\n」だった場合、本来処理すべき「正味の文字列」は「abc」であり、「\n」は行末を示す記号「End Of Line」です。EOLは処理系のよって異なり、Windowsであれば「\r\n」ですし、旧式のMacなら「\r」です。(ひょっとしたら、Rubyのgetsで読み込むとどのOSでも「\n」になるかもしれませんが、ちょっと話はそれますが、C言語なら文字列の終端は「\0」で表現されます。) ですから、処理対象の文字列を意味する「str」という変数には、「最初からabc」が入っているのが意味的にはより自然であると考えます。 また、今は単純な例なので、while〜end ループ内で「str」を一回しか使用しませんが、今後処理が追加・変更されると、strを何度も利用するかもしれません。そうすると処理の度に毎回「.comp」で前処理するのは無駄です。 さらに、「本来の意味」からしても、(処理すべき文字を)「何も入力せずに」[ENTER]を押す⇛「処理を終える」なので、「処理すべき入力」=「str」が「空」でない間、処理を繰り返す、という記述の方が「自然」です。
otn

2015/09/28 01:24

あとは、空行が入る前に入力がEOFになると言うことを考慮するかどうかですね。 EOFになるとgetsがnilになるのでchompできません。
sika_boze

2015/09/28 07:17

pi-chanさん 納得のいく説明をありがとうございます。 今回のケースだけではなく複雑になった場合の考え方も教えていただいたので非常に参考になりました!
sika_boze

2015/09/28 07:21

otnさん 回答ありがとうございます。 そうですね、大きいプログラムになったときには注意したいと思います。
guest

0

==で比較すると、「左右が同じものか」という判定になります。左側が文字列、右側が正規表現なので、一致することはありません。

正規表現にヒットするかのテストには、

ruby

1str =~ /regex/ 2/regex/ =~ str 3/regex/.match(str) # 詳しい情報も取れる

などなどの書き方を使います。

投稿2015/09/25 07:44

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sika_boze

2015/09/25 09:11

回答ありがとうございます。 正規表現の理解が少し深まりました! 一方で、  if /\n/.match(str) として判定したときは入力が一度しか読み込まれませんでした。 これはそもそもmatchが部分的に一致(改行のみでない場合を含む)してもtrueとなってしまうからでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問