在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中没有s
( dotall )标志/修饰符 。 在可用的地方,它通常强制点( .
)匹配换行符。 以下是您的案例可能的解决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