在JavaScript中使用动态(可变)字符串作为正则表达式模式


101

我想使用正则表达式向值添加一个(变量)标记,该模式在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>"));

但这似乎不对,我记录了模式及其确切的样子。有任何想法吗?


value变量吗?
Dogbert,

Answers:


173

要从字符串创建正则表达式,必须使用JavaScript的RegExpobject

如果你也想匹配/替换超过一次,那么你就必须添加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中sdotall)标志/修饰符


2
这是很棒的,到目前为止,我已经找到了在正则表达式中使用动态变量的最佳示例,谢谢!
Eolis 2015年

1
对于2019年 s修饰符,请在答案的注释中再次查看MDN链接。
Nickensoul19年

@Nickensoul好发现!感谢您的注意!
acdcjunior

让idr =新的RegExp(变量+“ $”); Table.find({字段:new RegExp(idr,'i')})我做到了。干杯。
乌特卡什

12

如果尝试在表达式中使用变量值,则必须使用RegExp“构造函数”。

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

6

您不需要"定义正则表达式,只需:

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包含正则表达式字符,如([?你需要躲避他们的。


2
除非寻找字符串“ value”,否则第一个选项将不起作用
mothmonsterman 2013年

@happytimeharry他发布的两个正则表达式之间似乎有冲突。
Halcyon

@Fritz van Campen似乎该模式的意图(以他的javascript为例)是使用一个变量
mothmonsterman

同样的问题,“ is”标志似乎存在问题:“未捕获的SyntaxError:提供给RegExp构造函数'is'的无效标志”
Borstenhorst 2013年

RegExp的构造函数的标志需要分开。但是正则表达式仍然无法正常工作。
Borstenhorst

5

我发现此线程很有用-所以我想我可以将答案添加到我自己的问题中。

我想从javascript中的节点应用程序中编辑数据库配置文件(datastax cassandra),并为文件中的其中一个设置修改字符串,然后替换其后的行。

这是我的解决方案。

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

我发现必须加倍斜杠\ b才能使其正常工作。例如,要使用变量从字符串中删除“ 1x”单词,我需要使用:

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");

为我工作。谢谢,
Pravin Bhapkar

1

更简单的方法:使用模板文字。

var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false

0
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/

希望这可以帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.