Javascript 将随机字符数组转换为regexp时,如何转义保留字符?

Javascript 将随机字符数组转换为regexp时,如何转义保留字符?,javascript,regex,Javascript,Regex,我有一个随机字符数组(可以是任何字符)。 我已成功地将它们转换为正则表达式: var regexMarkers = new RegExp(markers.toString().replace(/,/g, '|'), 'gi'); 这很好用。 问题是当随机字符数组包含特殊的正则表达式字符时,例如:$ 我应该把他们当作一个普通人 我发现: 但不能适用于我的情况(我是初学者,只是学习Javascript) 我试过这个: let newMarkers = regexMarkers.replace(/(

我有一个随机字符数组(可以是任何字符)。 我已成功地将它们转换为正则表达式:

var regexMarkers = new RegExp(markers.toString().replace(/,/g, '|'), 'gi');
这很好用。 问题是当随机字符数组包含特殊的正则表达式字符时,例如:$ 我应该把他们当作一个普通人

我发现: 但不能适用于我的情况(我是初学者,只是学习Javascript)

我试过这个:

let newMarkers = regexMarkers.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
但是我得到一个错误,regexMarkers.replace不是一个函数。
有什么建议吗?

要转义正则表达式中的任何特殊字符,只需在其前面使用
\
转义字符。您找到的regexp就是这样做的,您只需要在字符串上使用它:

var regexMarkers = new RegExp(markers.toString().replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1").replace(/,/g, '|'), 'gi');
您找到的regexp所做的只是匹配那些特殊的regex字符,并用表示匹配的特殊字符的
\$1
替换它们

这使得代码行有点长,所以将其拆分为多行不会有什么坏处,但这应该可以解决您的问题

下面是我自己的测试,以确保它工作正常:

let markers = ['a', 'b', '$', 'c'];
var regexMarkers = new RegExp(markers.toString().replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1").replace(/,/g, '|'), 'gi');
console.log(regexMarkers);
//output: /a|b|\$|c/gi

要转义正则表达式中的任何特殊字符,只需在其前面使用
\
转义字符。您找到的regexp就是这样做的,您只需要在字符串上使用它:

var regexMarkers = new RegExp(markers.toString().replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1").replace(/,/g, '|'), 'gi');
您找到的regexp所做的只是匹配那些特殊的regex字符,并用表示匹配的特殊字符的
\$1
替换它们

这使得代码行有点长,所以将其拆分为多行不会有什么坏处,但这应该可以解决您的问题

下面是我自己的测试,以确保它工作正常:

let markers = ['a', 'b', '$', 'c'];
var regexMarkers = new RegExp(markers.toString().replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1").replace(/,/g, '|'), 'gi');
console.log(regexMarkers);
//output: /a|b|\$|c/gi

regexMarkers.toString().replace…在
标记.toString()
上执行
replace
,就像您对
->
替换所做的那样,然后将字符串传递到
新的RegExp
。为什么不直接使用
escape
(和
unescape
)?regexMarkers.toString().replace…在
标记上执行
replace
。toString()
,就像您在
->
替换中所做的那样,然后将字符串传递到
新的RegExp
。为什么不直接使用
转义
(和
unescape
)?谢谢,@ethan reiland,这很有效。也谢谢你的解释,我不太清楚“\\\$1”部分。谢谢你,@ethan reiland,这很有效。同样感谢您的解释,我不确定“\\$1”部分。