在JavaScript中使用dynamic(可变)string作为正则expression式模式

我想添加一个(variables)标签值与正则expression式,该模式对PHP工作正常,但我有麻烦实施到JavaScript。

模式是( value是variables):

 /(?!(?:[^<]+>|[^>]+<\/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>")); 

但是这似乎不是正确的,我logging了模式和它应该是什么。 有任何想法吗?

要以stringforms创build正则expression式,您必须使用JavaScript的RegExp对象 。

另外,您可能想要匹配/replace多次。 在这种情况下,添加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演示在这里。

在一般情况下,使用正则expression式之前转义string:

不是每个string都是一个有效的正则expression式,但是:有一些speciall字符,比如([ 。要解决这个问题,只需在将string转换为正则expression式之前先将string转义出来。

 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演示在这里。


对于有问题的特定情况,请注意JavaScript中没有sdotall )标志/修饰符 。 在可用的地方,它通常强制点( . )匹配换行符。 以下是您的案例可能的解决scheme:

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

注意我在"<a href='#" + value +"'>"的末尾添加了一个缺失的'

在这里看演示提琴 。 您可能也想使用“g”修饰符来尝试此解决scheme 。

如果您正尝试在expression式中使用variables值,则必须使用RegExp“构造函数”。

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

你不需要"定义正则expression式,所以只是:

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

如果value是一个variables,你想要一个dynamic的正则expression式,那么你不能使用这个表示法; 使用替代符号。

String.replace也接受string作为input,所以你可以做"fox".replace("fox", "bear");

替代scheme:

 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包含正则expression式字符([[?您将需要转义它们。

我发现这个线程有用 – 所以我想我会添加答案,我自己的问题。

我想从JavaScript中的节点应用程序编辑数据库configuration文件(datastax cassandra),并且需要在string上匹配文件中的一个设置,然后replace它后面的行。

这是我的解决scheme。

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

运行后,它会将现有的数据目录设置更改为新的:

configuration文件之前:

 data_file_directories: - /var/lib/cassandra/data 

configuration文件后:

 data_file_directories: - /mnt/cassandra/data