如何动态创建正则表达式并在JavaScript中使用.match?

18

我需要动态创建正则表达式并在javascript的match函数中使用。这可能吗?

var p = "*|";
var s = "|*";
"*|1387461375|* hello *|sfa|* *|3135145|* test".match(/"p"(\d{3,})"s"/g)

这将是正确的正则表达式:/\*\|(\d{3,})\|\*/g

即使我在 p 和 s 中添加反斜杠也不起作用。这可能吗?


只需将 p"(\d{3,})"s 连接起来(根据 https://dev59.com/OHA75IYBdhLWcg3wJFmY 转义 ps)。 - Slippery Pete
2个回答

34

RegExp 是你的好朋友:

var p = "\\*\\|", s = "\\|\\*"

var reg = new RegExp(p + '(\\d{3,})' + s, 'g')

"*|1387461375|* hello *|sfa|* *|3135145|* test".match(reg)

使动态正则表达式全局的关键是将其转换为 RegExp 对象,并传递 'g' 作为第二个参数。

工作示例


你比我快了大约15秒 :). 最终结果是一个糟糕的正则表达式,但它匹配了op所要求的内容。 - wolffer-east
虽然在创建内置对象的实例时不需要使用new运算符,但仍然建议使用它。 - theftprevention
语法错误:无效的正则表达式:/|(d{3,})|/:无内容可重复。我还尝试了转义p和s,但没有成功。 - Alexandru R
1
@AlexandruRada 编辑。在使用 RegExp 时,需要双重转义。 - Daryl Ginn
对,我只是在转义,但并没有起作用。 - Alexandru R

0

您可以首先使用变量构建一个RegExp对象。同时,在形成RegExp对象时,请记得转义*|

var p = "*|";
var s = "|*";
var re = new RegExp(p.replace(/([*|])/g, '\\$1')
                 + "(\\d{3,})" + 
                 s.replace(/([*|])/g, '\\$1'), "g");

var m = "*|1387461375|* hello *|sfa|* *|3135145|* test".match(re);
console.log(m);

//=> ["*|1387461375|*", "*|3135145|*"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接