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

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

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

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

Q&A

解決済

3回答

2587閲覧

Rubyのgsubについて質問です

tk_matsumoto

総合スコア17

Ruby

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

0グッド

0クリップ

投稿2015/07/27 14:40

こんばんは。
Ruby gsubメソッドを用いて文字コードの置換を行う際に
気になった点があったので、質問させて下さい。

gsubの第一引数の正規表現の中での角かっこを用いた指定方法だと、
レシーバーの文字列の中で、角かっこ内で指定した文字列がマッチした場合置換という形になると思います。以下コードとなります

ruby

1"abc".gsub(/[a]/, "") 2=> bc

そこで、第一引数に文字コードを置換する正規表現を指定した場合、自分が予想した挙動と異なる動きをしたのが、少し気になりました。以下コードとなります

ruby

1"200".gsub(/[\u200E]/, "") 2=> 200

上記の処理の際に自分が予想した結果だと、レシーバーの200が置換されて、空文字列が返ってくると思っておりました。(角かっこ内に200が含まれている為)gsubの第一引数に文字コードの正規表現を指定した場合、その文字コードが1セットとしれ考えられるのでしょうか?

ご存知の方いらっしゃいましたらご回答していただけると嬉しいです!
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

Rubyではバックスラッシュ記法というのがあり、リテラルの中で
バックスラッシュ「\」から始まるところがあると特別な意味を持ちます。
※バックスラッシュ「\」はフォント環境によって半角の「¥」で表示される場合もあります。
これは本来表現できない文字(例えば改行\nなど)を表すための方法で、
""の文字列、//の正規表現、``のコマンド出力などで使用できます。
詳しいことは下記のマニュアルを参考にして下さい。
Ruby docs: リテラル

さて、上のことを踏まえますと、今回の\u200Eが表しているは字面通りではなく、
バックスラッシュ記法です。
\u200Eはユニコードの0x200E番目の文字(U+200E)というたった一つの文字を表します。
これは"2"という文字でも"0"という文字でもないため、gsubではマッチしないということです。

投稿2015/07/27 20:26

raccy

総合スコア21735

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

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

tk_matsumoto

2015/07/28 00:51 編集

ご回答ありがとうございます。 \u200Eが一つの文字を表すとの事で、なぜこの場合200が置換されないのか理解出来ました!ベストアンサーとさせて頂きます。 他の回答者の方も回答ありがとうございました。とても勉強になりました!
guest

0

$ irb irb(main):001:0> "abc".gsub(/a/, "") => "bc" irb(main):002:0> "200".gsub(/200/, "") => "" irb(main):003:0> "abcdefg".gsub(/[a-d]/, "") => "efg"

正規表現の [...] は文字のセットを指定するものです。
単に "a" を置換したいなら gsub(/a/, "") で良いです。
"200" を置換したいなら gsub(/200/, "") で良いです。

正規表現で [a-d] は [abcd] と同じ意味になります。

参考情報

投稿2015/07/27 21:20

katoy

総合スコア22324

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

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

0

unicode を調べてみたところ、"2" は 0032, "0" は 0030 でした。200E に相当する文字はなさそうですが…。

ですので、

ruby

1"200".gsub( /[\u0032]|[\u0030]/, "" ) 2=> ""

となりましたが、これでよろしいでしょうか。

ちなみに、[\uXXXX] の形で、正規表現中に文字を指定できることを、今回初めて知りました。
勉強になりました。

投稿2015/07/27 15:26

H_Kuruno

総合スコア65

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問