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

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

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

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

Q&A

解決済

1回答

109閲覧

文章の一部分をのみを置換したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2018/10/10 07:20

編集2018/10/13 05:27

文章の一部分をのみを置換したい

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

mather

2018/10/10 07:36

「試したこと」を実行した結果、どういう問題があったかを書いてください。
guest

回答1

0

ベストアンサー

undefined method `[]' for nil:NilClass (NoMethodError)

はおそらく $name_tbl[ref] で発生しています。 $name_tbl (グローバル変数)は無いですから、 nil になってしまいます。
name_tbl[ref] でいいんじゃないでしょうか。

それと、scangsub! を同時に使うのは良くないと思います。scanで一度検索したあと、その文字列そのものを置き換えると挙動がおかしくなりかねません。
gsubscan と同じようにブロックを使うことが出来ます。
https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html

> 文字列中で pattern にマッチした部分を順番にブロックに渡し、 その実行結果で置き換えた文字列を生成して返します。

ruby

1replaced_body_md = body_md.gsub(/[[(.+)]]/) { |(ref)| 2 "[#{ref}](/posts/#{name_tbl[ref]})" 3}

投稿2018/10/10 08:05

編集2018/10/10 08:16
mather

総合スコア6753

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

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

退会済みユーザー

退会済みユーザー

2018/10/10 08:11

すみません、入っておりました 取り除いて実行したところ、 in `scan': string modified (RuntimeError) とエラーがでました
mather

2018/10/10 08:14

その部分が怪しかったのでコメントに追記しました。
退会済みユーザー

退会済みユーザー

2018/10/13 05:28 編集

p replaced_ "[[[hoge]]](/posts/)" "[[[none]]](/posts/)" "foo" "[[[hoge]][[bar]]](/posts/)" となってしましました
asm

2018/10/10 08:34

> replaced_body_md = body_md.gsub(/[[(.+)]]/) { |(ref)| だと > {"number" => 11111, "name" => "baz", "body_md" => "[[hoge]][[bar]]"} のパターンで置換がうまくいかないと思いますよ
退会済みユーザー

退会済みユーザー

2018/10/10 08:36

もうしわけありません。勉強不足です。 何か方法ご教示お願いできますか。。。
asm

2018/10/10 09:00 編集

"[#{ref}](/posts/#{name_tbl[ref]})" を "[#{$1}](/posts/#{name_tbl[$1]})" に変更 ブロック引数は取らなくてもよい
退会済みユーザー

退会済みユーザー

2018/10/13 05:28 編集

こうでしょうか。。すみません
mather

2018/10/10 09:15

すみません。自分でも確かめるべきでした。 正規表現は最長一致なので、[[ で始まり ]] で終わる一番長い文字列を探してしまいます。 中間に ]] があってはいけない、という条件を入れると /[[([^]]+)]]/ となります。 また、 $1 を使わないと ( ) でマッチした部分だけを取り出せないですね。 replaced_body_md = body_md.gsub(/[[([^]]+)]]/) { |ref| "[#{$1}](/posts/#{name_tbl[$1]})" } でどうでしょうか。
退会済みユーザー

退会済みユーザー

2018/10/10 12:53

出来ました、ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問