在 JavaScript 中使用动态(变量)字符串作为 regex 模式

我想 添加(变量)标记的值与正则表达式,模式工程与 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>"));

但是这看起来不对,我记录了这个模式和它应该是什么样子。 有什么想法吗?

276880 次浏览

你不需要 "来定义一个正则表达式,只需要:

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包含像 ([?这样的正则表达式字符,则需要转义它们。

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

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

要从字符串创建正则表达式,必须使用 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.

这里是 JSFiddle 演示。


在一般情况下,在使用 regex 之前转义字符串:

不过,并非每个字符串都是有效的正则表达式: 有一些特殊字符,如 ([。要解决这个问题,只需在将字符串转换为正则表达式之前转义该字符串即可。下面的例子中有一个实用函数:

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修饰符,在问题出现的时候 但是 < strong > 确实存在 ——一个 JavaScript 中的 s(< em > dotal )标志/修饰符——今天还不存在。

我发现这个帖子很有用——所以我想我应该把答案加到我自己的问题上。

我想用 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
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/

希望这个能帮上忙

我发现我不得不双斜杠 b 才能让它工作。例如,要使用变量从字符串中删除“1x”单词,我需要使用:

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

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

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

使用字符串变量内容作为更复杂的组合正则表达式(es6 | ts)的一部分

此示例将使用 my-domain.com替换所有 url 到 my-other-domain(两者都是变量)。

可以通过在原始字符串模板中组合字符串值和其他正则表达式来执行动态正则表达式。使用 String.raw将防止 javascript 转义字符串值中的任何字符。

// Strings with some data
const domainStr = 'my-domain.com'
const newDomain = 'my-other-domain.com'


// Make sure your string is regex friendly
// This will replace dots for '\'.
const regexUrl = /\./gm;
const substr = `\\\.`;
const domain = domainStr.replace(regexUrl, substr);
// domain is a regex friendly string: 'my-domain\.com'
console.log('Regex expresion for domain', domain)


// HERE!!! You can 'assemble a complex regex using string pieces.
const re = new RegExp( String.raw `([\'|\"]https:\/\/)(${domain})(\S+[\'|\"])`, 'gm');


// now I'll use the regex expression groups to replace the domain
const domainSubst = `$1${newDomain}$3`;


// const page contains all the html text
const result = page.replace(re, domainSubst);

注意: 不要忘记使用 regex101.com 来创建、测试和导出 REGEX 代码。