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


206

だから例えば:

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

しかし、これはもちろん機能していません:)これを行う方法はありますか?


11
ユーザーがこの変数を指定できるようにすると、悪意のあるユーザーが壊滅的なバックトラッキングを介してアプリケーションをクラッシュさせることが容易になることに注意してください。
Tim Pietzcker、

2
「ReGeX」とは?変数名ですか?それはRegExpの構成の一部であることを暗示することで答えを混乱させます(読者が質問でそれらの奇妙な文字を見なかった場合)。
エデュアルド、

回答:


272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

更新

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

ES6アップデート

2019年、これは通常テンプレート文字列を使用して記述され、上記のコードが更新されました。元の答えは:

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

5
文字列をエスケープしてください!@zzzzBovの回答を見る
jtpereyda '06 / 10/21

これは私のケースでは機能しません。このjsfiddleを見、国コードを動的にregex表現したい場合に何をしなければならないか
教えてください

10
覚えておくべき重要なことの1つは、通常の文字列では\文字をエスケープする必要があるのに対し、正規表現リテラルでは(通常)/文字をエスケープする必要があるということです。そう/\w+\//iなるnew RegExp("\\w+/", "i")
アリ

3
/ gはどうですか?
Qian Chen

みんな、私はこの正規表現/[^0-9.-]/gを/ [^ 0-9と-] / gの2つの部分に分割する必要があります。
最大

79

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

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

次にregexstring、好きなように構築できます。

詳細については、こちらをご覧ください


var characterCount = parseInt(attrs.limitCharacterCount); console.log(characterCount); var specialCharactersValidation = new RegExp( "/ ^ [a-zA-Z0-9] {" + characterCount + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ // requestShipmentDirectives.js:76 false main.js:46 Uncaught TypeError:cannot read property 'offsetWidth' of nullこれは私が作ったときに起こっていることですRegEx Dynamic。
Ankit Tanna

31

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);
}

これが機能する唯一の方法は、ReGeXテキストを削除した場合です。だから私は使用しました:return new RegExp(input, flags);
Michael Rader

2
@MichaelRader、はい、「ReGeX」テキストは質問の一部であり、コードを機能させるために必要なものとしてではなく、例として使用されました。
zzzzBov 2016

1
笑これはあなたのプレースホルダーにすぎないことに気づきましたが、初心者としてこれを理解するにはしばらく時間がかかりました。ありがとう。
Michael Rader

文字列をエスケープする必要がある理由を理解しています。しかし、なぜ「\\ $&」が置換として使用されるのか
Sherin Binu

2
\\単一の\文字を表し$&、一致した部分文字列です。
zzzzBov

7

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

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

テンプレートリテラルでは機能しません。アプリでパスワードを検証するために正規表現を使用していますが、正規表現文字列の最大長と最小長をパラメーター化したかったのですが、機能しません。`` `const newRegExp = new RegExp(^[^\s]{${4},${32}}$); エクスポートconst validatePassword = value => value.match(newRegExp); `` `
p7adams

6

あなたは常に文字列として正規表現を与えることができます、すなわち "ReGeX" + testVar + "ReGeX"ます。文字列内の一部の文字(二重引用符など)をエスケープする必要があるかもしれませんが、ほとんどの場合それは同等です。

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


3

JSで正規表現を作成するには、次の2つの方法があります。

  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


2

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

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)

2

受け入れられた回答は私にとっては機能せず、MDNの例に従っていない

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

私は次のようにしてそれは私のために働いています:

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

// that makes dynamicRegExp = /findMe/gi

1
それはまだ機能します。問題は、「ReGeX」+ testVar +「ReGeX」がソリューションを混乱させることです。実際の例を追加すると、私の意見では明確になります。var testVar = '321'; var regex = new RegExp( "[" + testVar + "] {2}"、 "g"); //上記は/ [321] {2} / gと同等
HelloWorldPeace

1

最初に文字列変数を準備し、それを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で変更されます。

お役に立てれば幸いです。英語もごめんなさい。

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