正規表現で変数をどのように使用しますか?


1380

String.replaceAll()JavaScriptでメソッドを作成したいのですが、正規表現を使用するのが最も簡単な方法だと思います。ただし、変数を正規表現に渡す方法がわかりません。私はすべてのインスタンスに置き換えられますどのすでにこれを行うことができます"B"してを"A"

"ABABAB".replace(/B/g, "A");

しかし、私はこのようなことをしたいです:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

しかし、明らかにこれはテキストを置き換えるだけ"replaceThis"です...では、この変数を正規表現文字列に渡すにはどうすればよいですか?


9
この機能をJavaScriptに追加する作業を現在行っていることにご注意ください。ご意見があれば、ディスカッションに参加してください。
Benjamin Gruenbaum 2015年

回答:


1842

/regex/g構文を使用する代わりに、新しいRegExpオブジェクトを作成できます。

var replace = "regex";
var re = new RegExp(replace,"g");

この方法で動的に正規表現オブジェクトを作成できます。それからあなたはします:

"mystring".replace(re, "newstring");

272
のような式を使用する必要がある場合は/\/word\:\w*$/、バックスラッシュをエスケープしてくださいnew RegExp( '\\/word\\:\\w*$' )
ジョナサンスウィニー2010年

2
@gravityboy( '' + myNumber).replace(/ 10 / g、 'a')または16進数が必要な場合は、parseInt( '' + myNumber、16)を実行して、10進数から16進数に変換できます。
エリックウェン

29
この質問は、RegExは定数文字列の置換を行うためにのみ使用されることを示唆しています。文字列にRegExメタ文字が含まれていると失敗するため、これは間違っています。悲しいことに、これほど高い票が投じられ、多くの頭痛の種となるでしょう
dronus

16
変数を渡すこの例は、これを適切な答えにします。これを読んでもまだ苦労しています。
グース

3
@JonathanSwinney:/文字列から正規表現を作成する場合、特別な意味はないため、エスケープする必要はありません。/\/word\:\w*$/する必要がありますnew RegExp('/word\\:\\w*$')
ダビッドHorváth2017年

211

Eric Wendelinが述べたように、次のようなことができます。

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

これはをもたらす"regex matching ."。ただし、str1がの場合は失敗し"."ます。結果はになるはず"pattern matching regex"ですが、ピリオドを"regex"に置き換えますが、次のようになります...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

これは"."、文字列ではありますが、RegExpコンストラクタでは正規表現として解釈されます。つまり、改行以外の文字、つまり文字列内のすべての文字を意味します。この目的のために、次の関数が役立つ場合があります。

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

次に、次のことができます。

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

降伏する"pattern matching regex"


4
置換する最初のパラメータは通常の文字列にすることができ、正規表現である必要がないことを知っていますか?str1 = "。"; alert( "パターンマッチング。"。replace(str1、 "string"));
いくつかの

@some:もちろんです。これは、上記の例は簡単なものだからです。通常の文字列と組み合わせたパターンを検索または置換する必要がある場合は、たとえばstr.match(new RegExp( "https?://" + RegExp.escape(myDomainName))を実行します。エスケープ関数が組み込みではありません
。– Gracenotes

(続き)さらに、見かけのJC Grubbsにはグローバルな置き換えが必要でした。大規模な入力の場合、String.replace(String、String)を使用したグローバル置換の実装は遅くなる可能性があります。私が言っているのは、上位2つのソリューションはバグが多く、特定の入力で予期しないエラーが発生することです。
Gracenotes

4
developer.mozilla.org/en-US/docs/JavaScript/Guide/…も同様の機能を提供ますが、を除外し-、を含めます=!:/
chbrown

8
正しい用語は「引用」ではなく「エスケープ」です。ちなみに。
Lawrence Dol、2015

118

"ABABAB".replace(/B/g, "A");

いつものように:必要がない限り、正規表現を使用しないでください。単純な文字列置換の場合、イディオムは次のとおりです。

'ABABAB'.split('B').join('A')

そうすれば、Gracenotesの回答で言及されている引用の問題について心配する必要はありません。


11
そして、これは正規表現よりも速いと測定しましたか?
Mitar 2013

3
これは、特に「。」などの特殊な正規表現文字に一致させる必要がある場合に、好ましいと思われます。
Krease 2013

1
うーん...分割も正規表現を取りません。もしそうなら、それは同じ問題を引き起こしませんか?とにかく... .replace()は1つの操作であり、最適化される可能性があるのに対し、.split()。join()は2つの操作であるため、一部のプラットフォームでは遅くなる可能性があります。

5
@ PacMan--:両方splitreplace、文字列またはRegExpオブジェクトのいずれかを取ることができます。それreplaceが持ってsplitいない問題は、あなたが文字列を使用するとき、あなたは単一の置換しか得ないということです。
ボビンス2013年


38

すべての出現を取得したい場合(g)、大文字と小文字を区別せず(i)、境界を使用して、別の単語(\\b)内の単語ではないようにします。

re = new RegExp(`\\b${replaceThis}\\b`, 'gi');

例:

let inputString = "I'm John, or johnny, but I prefer john.";
let replaceThis = "John";
let re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.

ありがとうございました!(rxテンプレートの文字列を介して、Emacs / スタイルの補間で明示的に唯一の答えは、あなたの答えです。)
sam boosalis

34

matchメソッドで変数を使用したい人にとって、これは私にとってうまくいきました

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight


20
this.replace( new RegExp( replaceThis, 'g' ), withThis );

この回答は、余分な(および無意味な)変数を作成しないため、気に入っています。
ウィック

14

正規表現を動的に構築したい場合、適切な解決策はnew RegExp(string)コンストラクタを使用することです。コンストラクターが特殊文字を文字どおりに処理するために、それらをエスケープする必要があります。そこビルトインされた関数のウィジェットのjQuery UIのオートコンプリートと呼ばれます$.ui.autocomplete.escapeRegex

[...]組み込み$.ui.autocomplete.escapeRegex関数を利用でき ます。単一の文字列引数を取り、すべての正規表現文字をエスケープして、結果を安全に渡しnew RegExp()ます。

jQuery UIを使用している場合は、その関数を使用するか、その定義をソースからコピーできます。

function escapeRegex( value ) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

次のように使用します。

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"

9
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

このツールでテストする


5
String.prototype.replaceAll = function(a, b) {
    return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}

次のようにテストします:

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))

4

次に、別のreplaceAll実装を示します。

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

4

そして、これはスティーブペニーの回答のコーヒースクリプトバージョンです。これは、#2のgoogle結果です。

baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food

そして私の特定のケースでは

robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
  console.log "True!"

なぜ反対票か それ自身の特定の構文を持つcoffeescript -IS- javascript。
2015

robot.name=hubotJavaScriptではありません。
codepleb

3

動的に作成されたRegExpを(この質問に対する他の応答に従って)作成できますが、同様の投稿からコメントをエコーし​​ます。String.replace()の関数形式は非常に便利であり、多くの場合、動的に作成されたRegExpオブジェクト。(これは、スラッシュ/ [AZ] + / regexpリテラル形式を使用するのではなく、RegExpコンストラクタへの入力を文字列として表現する必要があるため、一種の苦痛です)


3

正規表現に変数/エイリアス/関数を挿入するという私のニーズを満たすために、これは私が思いついたものです:

oldre = /xx\(""\)/;
function newre(e){
    return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};

String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

ここで、「oldre」は変数を挿入する元の正規表現、「xx」はその変数/エイリアス/関数のプレースホルダー、「yy」は実際の変数名、エイリアス、または関数です。


2

$ 1が使えない場合に使用できます

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");

1

いつでもindexOf繰り返し使用できます。

String.prototype.replaceAll = function(substring, replacement) {
    var result = '';
    var lastIndex = 0;

    while(true) {
        var index = this.indexOf(substring, lastIndex);
        if(index === -1) break;
        result += this.substring(lastIndex, index) + replacement;
        lastIndex = index + substring.length;
    }

    return result + this.substring(lastIndex);
};

置換に一致するものが含まれている場合、これは無限ループに入りません。


1

あなたの解決策はここにあります:

変数を正規表現に渡します。

私が実装したものは、置換したいテキストフィールドから値を取得することであり、もう1つは「置換」テキストフィールドです。変数のテキストフィールドから値を取得し、変数をRegExpに設定します。さらに置き換える機能。私の場合、私はJqueryを使用していますが、JavaScriptだけでも実行できます。

JavaScriptコード:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace
  var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string.

  var sRegExInput = new RegExp(replace, "g");    
  $("body").children().each(function() {
    $(this).html($(this).html().replace(sRegExInput,replace_with));
  });

このコードはボタンのOnclickイベントにあり、これを呼び出す関数に配置できます。

したがって、置換関数で変数を渡すことができます。


replace_with変数には、値自体ではなくDOM要素が含まれます
Ben Taliadoros '27 / 10/27

1

この自己呼び出し関数は、インデックスを使用してreplacerItemsを反復処理し、各パスで文字列のreplacerItems [index]をグローバルに変更します。

  const replacerItems = ["a", "b", "c"];    

    function replacer(str, index){
          const item = replacerItems[index];
          const regex = new RegExp(`[${item}]`, "g");
          const newStr = str.replace(regex, "z");
          if (index < replacerItems.length - 1) {
            return replacer(newStr, index + 1);
          }
          return newStr;
    }

// console.log(replacer('abcdefg', 0)) will output 'zzzdefg'

0

これらの答えはどれも私にははっきりしていませんでした。私は最終的にhttp://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/で良い説明を見つけました

簡単な答えは:

var search_term = new RegExp(search_term, "g");    
text = text.replace(search_term, replace_term);

例えば:

$("button").click(function() {
  Find_and_replace("Lorem", "Chocolate");
  Find_and_replace("ipsum", "ice-cream");
});

function Find_and_replace(search_term, replace_term) {
  text = $("textbox").html();
  var search_term = new RegExp(search_term, "g");
  text = text.replace(search_term, replace_term);
  $("textbox").html(text);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textbox>
  Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
</textbox>
<button>Click me</button>


1
クロージャー変数を上書きしているので、varここで使用する必要はありません。また、合格\bまたは\1破損した場合。
Cyber​​AP

0

正規表現を使用しない複数の置換の場合、私は次のようにしました:

      let str = "I am a cat man. I like cats";
      let find = "cat";
      let replace = "dog";


      // Count how many occurrences there are of the string to find 
      // inside the str to be examined.
      let findCount = str.split(find).length - 1;

      let loopCount = 0;

      while (loopCount < findCount) 
      {
        str = str.replace(find, replace);
        loopCount = loopCount + 1;
      }  

      console.log(str);
      // I am a dog man. I like dogs

ソリューションの重要な部分はここで見つかりました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.