web-dev-qa-db-ja.com

Javascript Regex:正規表現の中に変数を入れる方法は?

たとえば、次のとおりです。

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

しかし、これはもちろん動作しません:)これを行う方法はありますか?

164
Adam
var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

更新

一部のコメントでは、悪意のあるコンテンツの可能性がある場合は escape thevariableにしたい場合があることに注意することが重要です。 (たとえば、変数はユーザー入力から来ます)

230
Jason McCreary

RegExpオブジェクトを使用できます。

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

その後、任意の方法でregexstringを作成できます。

それについてもっと読むことができます こちら

73
steinar

JavaScriptの変数から正規表現を作成するには、文字列パラメーターで RegExp コンストラクターを使用する必要があります。

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

もちろん、これは非常に素朴な例です。 inputが正規表現に対して適切にエスケープされていることを前提としています。ユーザー入力を処理している場合、または単に特殊文字を一致させるのに便利にしたい場合は、 特殊文字をエスケープする にする必要があります。

function regexEscape(str) {
    return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}
30
zzzzBov

常に正規表現を文字列、つまり"ReGeX" + testVar + "ReGeX"として指定できます。文字列内の一部の文字(二重引用符など)をエスケープする必要がある場合がありますが、ほとんどの場合は同等です。

RegExpコンストラクタを使用して、フラグを渡すこともできます( ドキュメントを参照 )。

6
Nikita Rybak

es6を使用している場合 テンプレートリテラル はオプションです...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
3
shunryu111

受け入れられた答えは私にとってはうまくいかず、従わない MDNの例

上記のリンクの「説明」セクションを参照してください

私はそれが私のために働いている次のものに行きます:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi
2

次の2つの方法のいずれかで、JSで正規表現を作成できます。

  1. 正規表現リテラルの使用-/ab{2}/g
  2. 正規表現コンストラクターを使用する-new RegExp("ab{2}", "g")

正規表現リテラルは定数であり、変数とともに使用することはできません。これは、コンストラクタを使用して実現できます。 RegExコンストラクターの構造は

new RegExp(regularExpressionString, modifiersString)

RegularExpressionStringの一部として変数を埋め込むことができます。例えば、

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

これは、パターンcdcdcdの外観に一致します。

1
Ben Carp

最初に文字列変数を準備してから、それをRegExに変換するだけです。

例えば:

RegExへの変数を使用してminLengthMaxLengthを追加します。

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

MaxLengthまたはMinLengthの値を変更すると、すべてのRegExで変更されます。

役に立つことを願っています。また、私の英語についてすみません。

1

以下は、特定の文字でラップされた値を返すかなり役に立たない関数です。 :)

jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)
1
Jakob Sternberg