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

时间:2013-07-26 15:55:11

标签: javascript regex string

我希望使用正则表达式向值添加(变量)标记,该模式适用于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>"));

但这似乎不对,我记录了模式,它应该是它应该是什么。 有什么想法吗?

8 个答案:

答案 0 :(得分:109)

要从字符串创建正则表达式,您必须使用JavaScript's RegExp object

我还想多次匹配/替换,然后不要忘记添加the g (global match) flag。这是一个例子:

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 demo here.


在一般情况下,在使用正则表达式之前转义字符串:

并非每个字符串都是有效的正则表达式:有一些特殊字符,例如([。要解决此问题,只需转义字符串,然后再将其转换为正则表达式。其实用功能如下:

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 demo here.



注意:问题中的正则表达式使用s修饰符does not exist -- there is no s (dotall) flag/modifier in JavaScript

答案 1 :(得分:9)

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

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

答案 2 :(得分:4)

我发现这个帖子很有用 - 所以我想我会为自己的问题添加答案。

我想在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

答案 3 :(得分:2)

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

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包含正则表达式字符,例如([?,则需要将其转义。

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

此示例将使用 my-domain.commy-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 代码。

答案 6 :(得分: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/

希望这会有所帮助

答案 7 :(得分:0)

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

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