web-dev-qa-db-ja.com

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

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

63
Borstenhorst

文字列から正規表現を作成するには、 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のフラグ/修飾子-今日

121
acdcjunior

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

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

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

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
JRD

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

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([?などの正規表現文字が含まれている場合は、それらをエスケープする必要があることに注意してください。

3
Halcyon
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/

お役に立てれば

0
Vinu