1. ホーム
  2. javascript

[解決済み] JavaScriptの置換/正規表現

2022-03-02 20:08:06

質問

この関数が与えられた。

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(pattern, value);
        }

    };

    return repeater;

};

を作るにはどうしたらいいのでしょうか? this.markup.replace() をグローバルに置き換えるか?問題はここからです。こんな風に使ったら

alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);

アラートの値は "foobar $TEST_ONE" です。

を変更すると Repeater を以下のように変更すると、Chromeでは何も置き換わりません。

function Repeater(template) {

    var repeater = {

        markup: template,

        replace: function(pattern, value) {
            this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
        }

    };

    return repeater;

};

...そして、アラートは $TEST_ONE $TEST_ONE .

解決方法は?

RegExp 文字をダブルエスケープする必要があります (文字列のスラッシュと正規表現に 1 回ずつ)。

  "$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")

それ以外の場合は、行末と'TESTONE'を探します(これは決して見つかりません)。

個人的には、このような理由から、文字列を使って正規表現を構築するのはあまり好きではありません。 エスケープが必要なレベルでは、酒を飲むことになりかねないからです。 しかし、他の人は違う考えを持っていて、正規表現を書くときにお酒を飲むのが好きなのでしょう。