web-dev-qa-db-ja.com

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

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

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

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

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

しかし、明らかにこれはテキスト"replaceThis"...を置き換えるだけなので、この変数を正規表現文字列に渡す方法を教えてください。

1140
JC Grubbs

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

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

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

"mystring".replace(re, "newstring");
1585
Eric Wendelin

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"を返します。

182
Gracenotes

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

いつものように:あなたがしなければならない限り正規表現を使用しないでください。単純な文字列置換の場合、慣用句は次のとおりです。

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

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

97
bobince

match メソッドで変数を使用したい人のために、これは私のために働いた

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

この:

var txt=new RegExp(pattern,attributes);

これと同等です:

var txt=/pattern/attributes;

http://www.w3schools.com/jsref/jsref_obj_regexp.asp を参照してください。

27
Jeremy Ruten
this.replace( new RegExp( replaceThis, 'g' ), withThis );
17
tvanfosson

すべての出現箇所(g)を取得する場合は、大文字と小文字を区別しないで(i)、他のWord内のWordではないように境界を使用します(\\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.
16
JBallin

あなたは動的に正規表現を構築したいのですが、そのための適切な解決策は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
Salman A
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

これでテストする tool

9
unigogo
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("]", ">"))
5
MetalGodwin

これは別の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
scripto

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

3
Jason S

そして、Steven Pennyの答えのコーヒースクリプト版は、これが#2グーグルの結果なので…。たとえコーヒーがちょうど多くの文字が取り除かれたjavascriptであっても…;)

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!"
3
keen

変数/別名/関数を正規表現に挿入するという私の必要性を満たすために、これが私が思いついたものです:

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'はその変数/ alias/functionのプレースホルダー、 'yy'は実際の変数名、別名、または関数です。

3
Alex Li

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
Ry-

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

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

私が実装したものは、あなたが置き換えたいものであるテキストフィールドから値を取得することであり、もう一つは "replace with"テキストフィールドです。さらに交換する機能。私の場合は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イベントにあり、これを呼び出す関数に入れることができます。

だから今あなたは置換関数で変数を渡すことができます。

1
Ajit Hogade

$ 1がうまくいかない場合はこれを使うことができます。

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

これらの答えのどれも私には明らかではありませんでした。私は結局 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>
0
Paul Jones