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

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

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

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

正規表現

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

Q&A

解決済

2回答

1495閲覧

Rubyでwindowsのコンソールからgetsした文字列がRegexp.newでエラーになってしまう

pyxis

総合スコア16

Ruby

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

正規表現

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

0グッド

0クリップ

投稿2019/02/26 04:55

前提・実現したいこと

Rubyでwindowsのコンソールからgetsした文字列を特定の文字列と正規表現を使って
一致するか確かめたいです。

どのように書けば良いでしょうか、宜しくお願いします。

発生している問題・エラーメッセージ

getsでコンソールから日本語を入力すると次の様なエラーが出ます。
半角英数字だとエラーは出ません。

test.rb:3:in `initialize': invalid multibyte character: /\x96k\x8AC\x93\xB9/ (RegexpError)

該当のソースコード

Ruby

1string = gets.chop.force_encoding("utf-8") 2 3rg_string = Regexp.new(string) 4 5puts "北海道".match(/#{rg_string}/)

試したこと

string = gets.chop
としたり
string = gets.chop.force_encoding("shift_jis")
にしてもエラーになりました。

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

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

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

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

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

guest

回答2

0

自己解決

Ruby

1#encoding: shift_jis 2 3string = gets.chop.force_encoding("shift_jis") 4 5rg_string = Regexp.new(string) 6 7puts "北海道".match(/#{rg_string}/)

上のように書いてshift_jisで保存することで解決しました。
回答ありがとうございました。

投稿2019/02/26 17:07

pyxis

総合スコア16

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

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

otn

2019/02/27 01:30

.force_encoding("shift_jis") は不要です。
pyxis

2019/02/27 12:53

.force_encoding("shift_jis") を付けないと自分の環境ではエラーが出ます。 付けないでエンコードを調べると string = gets.chop puts string.encoding #=>UTF-8 となります。
otn

2019/02/27 13:31

ああ、Rubyをインストールするときに、 Use UTF-8 as default external encoding のチェックボックスをオンにしたんですね。そのままで行くのであれば、すべてUTF-8に統一した方が良いと思います。ソースコードも、ファイルの中身も。
pyxis

2019/02/27 21:24

ご指摘の通りでした。 試しに Use UTF-8 as default external encoding を付けずにインストールしてみると string = gets.chop puts string.encoding #=>Windows-31J となりました。 しかしその場合 puts "北海道".match(/#{rg_string}/) の”北海道” の文字コードが Shift_JIS なので下のようなエラーが出ます。 test.rb:7:in `match': incompatible encoding regexp match (Windows-31J regexp wit h Shift_JIS string) (Encoding::CompatibilityError) なので、#encoding: shift_jis を #encoding: windows-31j に直したところエラーは出なくなりました。 今まで shift_jis と windows-31j は同じものだと思っていたのですが別物なのですね。
otn

2019/02/27 23:46

そうですね。Shift_JISの全角文字はJIS漢字の第一水準第二水準だけです。 Windows-31J(=CP932)は、それにマイクロソフトが独自に追加した文字を含みます。 (元は、NECがPC9801という1980年代のPC用に追加した文字)
guest

0

ソースコードをUTF-8で書いているのでしょうか?であれば、
string = gets.chop.encode("utf-8")
です。

なお、普通は、chopじゃなくてchompを使います。

投稿2019/02/26 05:05

otn

総合スコア84557

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

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

pyxis

2019/02/27 21:47

改行を消す目的であれば通常 chomp を使うようですね。 ご指摘ありがとうございます。
otn

2019/02/27 23:47

この回答は、 Use UTF-8 as default external encoding をオフにした環境で、ソースコードをUTF-8で書いた場合の話です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問