144

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

しかし、これは正しくないようです。私はパターンをログに記録し、それが正しいはずです。何か案は?

4

8 に答える 8

251

文字列から正規表現を作成するには、JavaScript のRegExpobjectを使用する必要があります。

また、複数回一致/置換したい場合は(global match) フラグを追加する必要があります。次に例を示します。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の時点では存在しなかった修飾子を使用していますが、存在します - JavaScriptのs( dotall ) フラグ/修飾子 - 今日

于 2013-07-26T16:19:07.667 に答える
18

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

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")
于 2013-07-26T15:58:02.607 に答える
7

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

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

ifには, などの正規value表現文字が含まれており、それらをエスケープする必要があることに注意してください。([?

于 2013-07-26T15:56:18.353 に答える
4

このスレッドが役立つことがわかったので、自分の問題に答えを追加すると思いました。

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
于 2016-03-03T13:22:48.593 に答える