(変数)タグを追加するを正規表現で値に追加したいのですが、パターンは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>"));
しかし、これは正しくないように思えます。パターンとその正確な記録を記録しました。何か案は?
文字列から正規表現を作成するには、 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.
ただし、すべての文字列が有効な正規表現であるとは限りません。(
や[
などの特殊文字がいくつかあります。この問題を回避するには、文字列をエスケープしてから正規表現に変換します。そのためのユーティリティ関数は、次のサンプルに含まれています。
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.
注:質問の正規表現はs
修飾子を使用します。これは質問の時点では存在していませんでしたが、 しかしは存在します-s
(dotall)JavaScriptのフラグ/修飾子-今日 。
式で変数値を使用する場合は、RegExpの「コンストラクター」を使用する必要があります。
var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")
私はこのスレッドが便利だと思ったので、自分の問題に対する答えを追加すると思いました。
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
正規表現を定義するために"
は不要なので、次のようにします。
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
に(
、[
、?
などの正規表現文字が含まれている場合は、それらをエスケープする必要があることに注意してください。
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/
お役に立てれば