JavaScript で動的 (変数) 文字列を正規表現パターンとして使用する 質問する

JavaScript で動的 (変数) 文字列を正規表現パターンとして使用する 質問する

したい(変数)タグを追加する正規表現を使用して値に適用する場合、パターンは PHP では正常に機能しますが、JavaScript に実装する際に問題があります。

パターンは次のとおりです (valueは変数です):

/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is

バックスラッシュをエスケープしました:

var str = $("#div").html();
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is";
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>"));

しかし、これは正しくないようです。パターンを記録しましたが、まさにそのとおりです。何かアイデアはありますか?

ベストアンサー1

文字列から正規表現を作成するには、JavaScriptのRegExpオブジェクト

複数回一致/置換したい場合は、しなければならない追加g(グローバルマッチ)フラグ以下に例を示します。

var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

JSFiddle のデモはここです。


一般的なケースでは、正規表現として使用する前に文字列をエスケープします。

(ただし、すべての文字列が有効な正規表現であるわけではありません。またはなどの特殊文字もあります[。この問題を回避するには、文字列を正規表現に変換する前にエスケープするだけです。そのためのユーティリティ関数は、以下のサンプルにあります。

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

var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;

var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.

JSFiddle のデモはここです。



注: 質問内の正規表現では修飾子が使用されていますがs、この修飾子は質問の時点では存在しませんでした。しかしある-- sドットオール) JavaScript のフラグ/修飾子 -- 今日

おすすめ記事