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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

846閲覧

JS iOS13以下だとreplaceAllは動かないのでreplaceで対応させたい

trhttrer

総合スコア4

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/12/10 20:29

iOS13以下だとreplaceAllは動かないのでreplaceで対応させたい

replaceですと最初に合致した文字しか置換されません
replaceAllと同じ動きにしたい場合どうすればいいのでしょうか?

const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; console.log(p.replaceAll('dog', 'monkey'));
const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; console.log(p.replace('dog', 'monkey'));

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

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

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

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

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

miyabi_takatsuk

2022/12/10 21:12

全ての該当文字にマッチさせたい、ということでしょうか?
guest

回答2

0

ベストアンサー

正解コード

javascript

1p.replace(/(?<!\w)dog(?!\w)/g, 'monkey');

解説

例のコード↓

javascript

1const p = 'dog. The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy? Hey, doggy! dog.'; 2 3const result1 = p.replaceAll('dog', 'monkey'); // 質問者様の元のコード 4const result2 = p.replace(/dog/g, 'monkey'); // ダメな正規表現例 5const result3 = p.replace(/(?<!\w)dog(?!\w)/g, 'monkey'); // 正解の正規表現 6 7console.log('1:', result1); 8// 1: monkey. The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy? Hey, monkeygy! monkey. 9console.log('2:', result2); 10// 2: monkey. The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy? Hey, monkeygy! monkey. 11console.log('3:', result3); 12// 3: monkey. The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy? Hey, doggy! monkey.
正規表現について

正規表現 - JavaScript | MDN

  • .replace()を使いつつ、条件に合致するもの全てを置換したければ正規表現を使います。
  • 正規表現とは、テキストをパターンと照合するための記法です。
  • 正規表現には二通りの記法がありますが、今回はリテラル記法を利用します(どちらでも同じです)。
    • リテラル記法の例:/abc/g
    • コンストラクターの例:new RegExp(/abc/, 'g')
正規表現(リテラル記法)の書き方

javascript

1/パターン/フラグ
  • 「パターン」は今回の場合でしたら、dogとなります。
    • ただ単に文字列を書くだけではなく、[a-z]←a〜zのいずれか1文字のような条件を書くこともできます。
    • 詳しくはお調べください。
  • 「フラグ」は今回の場合でしたら、gとなります。
    • gは、「グローバル検索」の意味で、つまり1回ヒットしたら終わりではなく、全文字検索するということです。.replaceAll()の代わりをしてくれます。
    • 他にもiなど、いろいろあります。giと複数書いてもいいです。詳しくはお調べください。
例のコード result1の問題点

javascript

1const p = 'dog. The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy? Hey, doggy! dog.'; 2 3const result1 = p.replaceAll('dog', 'monkey'); 4// monkey. The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy? Hey, monkeygy! monkey.

こちらは質問者様の書かれた.replaceAll()を用いたコードです。
変数pの文章を少し追加してみたのですが、最後の方の「doggy」が「monkeygy」になってしまうという問題点があります。

例のコード result2の問題点

javascript

1const result2 = p.replace(/dog/g, 'monkey'); 2// monkey. The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy? Hey, monkeygy! monkey.

こちらは.replace()と正規表現を用いたコードです。
こちらも同様に、最後の方の「doggy」が「monkeygy」になってしまうという問題点があります。
単純に「d」「o」「g」という並びの文字列をmonkeyに変更するという条件だからです。

しかし質問者様のご質問は、

replaceAllと同じ動きにしたい場合どうすればいいのでしょうか?

ですので、その場合はこのresult2が正解となります。

例のコード result3の解説

javascript

1const result3 = p.replace(/(?<!\w)dog(?!\w)/g, 'monkey'); 2// monkey. The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy? Hey, doggy! monkey.

上記の問題点を解決するために、より条件を厳しくした正規表現を書いたものがresult3です。
こちらは想定通りの置換をしてくれていると思います。

  • (?<!\w)は、dogの に、a〜z、A〜Z、0〜9、_がない という条件を表現しています。
  • (?!\w)は、dogの に、a〜z、A〜Z、0〜9、_がない という条件を表現しています。
  • doggyは、dogのあとにさらにgがありますから、条件に合致せず、monkeyに置換されません。

正規表現は他にもいろいろなパターンを表現することができますので、興味や必要がおありでしたら是非一度お勉強なさってみてください。

投稿2022/12/10 23:13

編集2022/12/10 23:25
Cocode

総合スコア2314

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

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

yambejp

2022/12/12 00:20

特別な指定がないかぎり単語の置換は無条件に変換すべきです たとえば例示のものではdogsをmonkeysに変換することができません
Cocode

2022/12/12 00:31

ご指摘ありがとうございます!おっしゃる通りですね。 ただ、英語の複数形はそんなに単純なものでもないので、複数形に関しては別で指定する方が良いかもしれませんね!
guest

0

const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
console.log(p.replace(/dog/g, 'monkey'));

投稿2022/12/10 23:09

編集2022/12/10 23:10
shishin

総合スコア73

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問