1. ホーム
  2. javascript

[解決済み] JavaScriptでstr_replaceを実行し、テキストを置き換えるには?

2022-05-14 06:38:42

質問

私は str_replace またはそれに似た代替手段を用いて、JavaScriptでテキストを置き換えることができます。

var text = "this is some sample text that i want to replace";
var new_text = replace_in_javascript("want", "dont want", text);
document.write(new_text);

を与える必要があります。

this is some sample text that i dont want to replace

正規表現を使用する場合、内蔵の置換メソッドと比較してパフォーマンスはどうなるのでしょうか。 内蔵の置換メソッドと比較して、どのようなパフォーマンス効果があるのでしょうか。

どのように解決するのですか?

文字列置換に regex を使用すると、著しく遅くなります。

実証されているように JSPerfで で示したように、正規表現の作成にはさまざまなレベルの効率がありますが、いずれも単純な文字列置換よりも大幅に遅くなります。 正規表現が遅くなるのは :

<ブロッククオート

固定文字列マッチには、バックトラック、コンパイルステップ、範囲、文字クラス、その他正規表現エンジンの速度を低下させる多くの機能がありません。正規表現マッチを最適化する方法は確かにありますが、一般的なケースでは、文字列へのインデックス付けに勝ることはないと思います。

JS perf ページでの簡単なテスト実行について、その結果の一部を文書化しました。

<script>
// Setup
  var startString = "xxxxxxxxxabcxxxxxxabcxx";
  var endStringRegEx = undefined;
  var endStringString = undefined;
  var endStringRegExNewStr = undefined;
  var endStringRegExNew = undefined;
  var endStringStoredRegEx = undefined;      
  var re = new RegExp("abc", "g");
</script>

<script>
// Tests
  endStringRegEx = startString.replace(/abc/g, "def") // Regex
  endStringString = startString.replace("abc", "def", "g") // String
  endStringRegExNewStr = startString.replace(new RegExp("abc", "g"), "def"); // New Regex String
  endStringRegExNew = startString.replace(new RegExp(/abc/g), "def"); // New Regexp
  endStringStoredRegEx = startString.replace(re, "def") // saved regex
</script>

Chrome 68の結果は以下の通りです。

String replace:    9,936,093 operations/sec
Saved regex:       5,725,506 operations/sec
Regex:             5,529,504 operations/sec
New Regex String:  3,571,180 operations/sec
New Regex:         3,224,919 operations/sec

この回答を完全なものにするために(コメントから拝借)、以下のことを述べておきます。 .replace はマッチした文字の最初のインスタンスを置き換えるだけです。そのため、すべてのインスタンスを //g . 複数の文字を置き換える場合、パフォーマンスとコードのエレガントさのトレードオフは悪くなります。 name.replace(' ', '_').replace(' ', '_').replace(' ', '_'); またはもっと悪い while (name.includes(' ')) { name = name.replace(' ', '_') }