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

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

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

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

Q&A

解決済

2回答

259閲覧

/が混じった文章をgsubでうまく置換したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2018/11/28 15:41

お世話になります。
Rubyのg_subで文字列の置換がうまくいきません。
\のエスケープには\が使えると書いてあり、試したのですがうまく置換されません。
うまく置換できる方法をご教授いただけないでしょうか?
Ruby.ver: 2.5.3

【置換前文字列】
"<div class=data-user_id=\"100\" data-app_id=\"200\"</div>"

【得たい文字列】
"<div class=data-user_id=\"300\" data-app_id=\"200\"</div>"

下記に実行結果を示します。

terminal

1~ $ irb 2irb(main):001:0> body = "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" 3=> "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" 4irb(main):002:0> body.gsub(/data-user_id=\"\d{3}\"/, "300") 5=> "<div class=300 data-app_id=\"200\"</div>" 6\ここまでは置換されているので、マッチングとしては問題ないと思われる 7irb(main):003:0> body = "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" 8=> "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" 9irb(main):004:0> body.gsub(/data-user_id=\"\d{3}\"/, "data-user_id=\"300\"") 10irb(main):005:1" 11\スラッシュをエスケープしているつもりができていない

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

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

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

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

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

guest

回答2

0

\という文字」と「エスケープするための特殊記号\」を区別しましょう。

元の、"<div class=data-user_id=\"100\" data-app_id=\"200\"</div>"や、置換後の"<div class=data-user_id=\"300\" data-app_id=\"200\"</div>"に出てくる\は、文字列の中に「\という文字」を含んでいる訳じゃなくて、"の中に"を書くためにRubyの記法上入れている記号なので、置換後に「\という文字」を入れては駄目です。"をエスケープするためだけに\を入れてください。

最終的に、HTMLに出力するのは<div class=data-user_id="300" data-app_id="200"</div>であり、\を出力したいわけではない事から、明らかです。

Ruby

1body.gsub(/data-user_id="\d{3}"/, "data-user_id=\"300\"") 2# 正規表現の中では、`"`には`\`は不要です

そういう混乱をしないためには、

Ruby

1body = '<div class=data-user_id="100" data-app_id="200"</div>' 2body.gsub(/data-user_id="\d{3}"/, 'data-user_id="300"') 3または、 4body = "<div class=data-user_id='100' data-app_id='200'</div>" 5body.gsub(/data-user_id='\d{3}'/, "data-user_id='300'")

と引用符をエスケープしないで書くのがいいでしょう。

投稿2018/11/28 23:36

otn

総合スコア84423

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

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

0

ベストアンサー

gsubの第2引数に現れる\記号は特殊な意味をもつので更にエスケープする必要があります。

rb

1body = "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" 2puts body.gsub(/data-user_id=\"\d{3}\"/, 'data-user_id="300"')

rb

1body = "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" 2puts body.gsub(/data-user_id=\"\d{3}\"/, "data-user_id=\"300\"")

投稿2018/11/28 16:02

編集2018/11/28 16:22
asm

総合スコア15147

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

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

退会済みユーザー

退会済みユーザー

2018/11/28 16:09

回答ありがとうございます。 上記の方法だと、`/`が余分につくように思います。 ```terminal ~ $ irb irb(main):001:0> body = "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" => "<div class=data-user_id=\"100\" data-app_id=\"200\"</div>" irb(main):002:0> body.gsub(/data-user_id=\"\d{3}\"/, 'data-user_id=\"300\"') => "<div class=data-user_id=\\"300\\" data-app_id=\"200\"</div>" ```
asm

2018/11/28 16:21

なら\いらんですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問