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


101

(変数)タグを正規表現で値に追加したいのですが、パターンは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>"));

しかし、これは正しくないようです。私はパターンとそのパターンを正確に記録しました。何か案は?


あるvalue変数は?
Dogbert 2013

回答:


173

文字列から正規表現を作成するには、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、質問の時点で存在しなかった修飾子を、しかしが存在しない - sDOTALL今日- JavaScriptで)フラグ/修飾子


2
これは素晴らしく、正規表現で動的変数を使用してこれまでに見つけた最高の例です、ありがとう!
Eolis、2015

1
2019の場合、 s修飾子があります。回答のメモのMDNリンクを再度参照してください。
Nickensoul

@Nickensoulまあ発見!ヘッドアップをありがとう!
acdcjunior

let idr = new RegExp(variable + "$"); Table.find({field:new RegExp(idr、 'i')})このようにしました。乾杯。
ウトカーシュ

12

式で変数値を使用する場合は、RegExp「コンストラクタ」を使用する必要があります。

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")

6

"正規表現を定義する必要はないので、次のようにします。

var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax

valueが変数であり、動的な正規表現が必要な場合は、この表記を使用できません。代替表記を使用します。

String.replace 文字列も入力として受け入れるので、 "fox".replace("fox", "bear");

代替:

var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is");

場合があることに留意してくださいvalueのような正規表現の文字が含まれている([?あなたはそれらをエスケープする必要があります。


2
最初のオプションは、文字列「value」を検索しない限り機能しません
mothmonsterman

@happytimeharry彼が投稿した2つの正規表現の間に矛盾があるようです。
Halcyon

@Fritz van Campen彼のJavaScriptからの例を考えると、パターンの意図は変数を使用することだったようです
mothmonsterman

ここで同じ問題、 "is"フラグに問題があるようです: "Uncaught SyntaxError:無効なフラグがRegExpコンストラクター 'is'に提供されています"
Borstenhorst

RegExpのコンストラクタのフラグは分離する必要があります。しかし、それでも正規表現は機能していません。
Borstenhorst 2013

5

私はこのスレッドが有用だと思ったので、自分の問題に答えを追加したいと思いました。

私は、javascriptのノードアプリケーションからデータベース構成ファイル(datastax cassandra)を編集し、ファイル内の設定の1つについて文字列を照合し、その後の行を置き換える必要がありました。

これが私の解決策でした。

dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml'

// a) find the searchString and grab all text on the following line to it
// b) replace all next line text with a newString supplied to function
// note - leaves searchString text untouched
function replaceStringNextLine(file, searchString, newString) {
fs.readFile(file, 'utf-8', function(err, data){
if (err) throw err;
    // need to use double escape '\\' when putting regex in strings !
    var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)";
    var myRegExp = new RegExp(searchString + re, "g");
    var match = myRegExp.exec(data);
    var replaceThis = match[1];
    var writeString = data.replace(replaceThis, newString);
    fs.writeFile(file, writeString, 'utf-8', function (err) {
    if (err) throw err;
        console.log(file + ' updated');
    });
});
}

searchString = "data_file_directories:"
newString = "- /mnt/cassandra/data"

replaceStringNextLine(dse_cassandra_yaml, searchString, newString );

実行後、既存のデータディレクトリ設定を新しい設定に変更します。

以前の設定ファイル:

data_file_directories:  
   - /var/lib/cassandra/data

後の構成ファイル:

data_file_directories:  
- /mnt/cassandra/data

4

\ bを機能させるには、\ bを2つスラッシュで切る必要があることがわかりました。たとえば、変数を使用して文字列から「1x」の単語を削除するには、次のようにする必要があります。

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");

私のために働いた。おかげで、
プラビンBhapkar

1

より簡単な方法:テンプレートリテラルを使用します。

var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false

0
var string = "Hi welcome to stack overflow"
var toSearch = "stack"

//case insensitive search

var result = string.search(new RegExp(toSearch, "i")) > 0 ? 'Matched' : 'notMatched'

https://jsfiddle.net/9f0mb6Lz/

お役に立てれば

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