Javascript 如何在JS中使用Regexp生成\文字反斜杠

Javascript 如何在JS中使用Regexp生成\文字反斜杠,javascript,regex,Javascript,Regex,我对Regexp非常陌生,似乎\是用于元字符的。我的问题是我想准确地搜索这个字符串\“mediaType\”:\“img\” 现在我还想动态地为img添加一个变量。所以我希望它是这样的 new RegExp(`\"mediaType\":\"${variable}\"`) 我如何写这篇文章才能让它工作?简短回答: function escapeRegEx(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } va

我对Regexp非常陌生,似乎
\
是用于元字符的。我的问题是我想准确地搜索这个字符串
\“mediaType\”:\“img\”

现在我还想动态地为img添加一个变量。所以我希望它是这样的

new RegExp(`\"mediaType\":\"${variable}\"`)

我如何写这篇文章才能让它工作?

简短回答:

function escapeRegEx(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

var expression = new RegExp('\\\\"mediaType\\\\":\\\\"' + escapeRegEx(variable) + '\\\\"');
// or, using a template literal:
var expression = new RegExp(`\\\\"mediaType\\\\":\\\\"${escapeRegEx(variable)}\\\\"`);
长答案:

function escapeRegEx(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

var expression = new RegExp('\\\\"mediaType\\\\":\\\\"' + escapeRegEx(variable) + '\\\\"');
// or, using a template literal:
var expression = new RegExp(`\\\\"mediaType\\\\":\\\\"${escapeRegEx(variable)}\\\\"`);
除了用于元字符外,正则表达式中的反斜杠还可用于转义本来有意义的字符(如
*
$
、括号和
\
)。因此,在正则表达式中匹配反斜杠的方法是添加另一个反斜杠作为转义字符:
\\

考虑到这一点,您希望最终得到的正则表达式是
\\\“mediaType\\”:\\\“img\\”
,如果您使用的是正则表达式文本,那么就是它。不幸的是,由于需要动态创建表达式,所以需要将表达式作为字符串提供,这也需要转义反斜杠,所以它会变得更加复杂。这增加了第二层转义,因此您需要再次将每个
\
字符加倍,最后得到
新的RegExp(“\\\\\”mediaType\\\”:\\\\\“img\\\”)


另一个复杂问题是,您希望
变量
的内容按字面匹配,而不是解释为正则表达式。不幸的是,JavaScript中没有内置的自动转义正则表达式的方法,因此您需要使用中的一种解决方案。我使用了接受答案的一个稍加修改的版本,将其定义为一个独立函数,而不是将其添加到
RegExp
对象中。确切的解决方案并不重要,只要您转义动态部分。

使用:
new Regex(“\\\\\\\\\\”mediaType\\\\\\”:\\\\\\\\\\\“img\\\\”)
\
是javascript字符串和正则表达式中的转义字符。你必须逃走。此外,您不需要在regex中转义
(如果您正试图这样做的话)do@ctwheels我需要
,因为它是我正在搜索的字符串的一部分for@anubhava只有三个\\\如果我做了四个,它给了我两个\\我只需要一个,谢谢你的帮助!@TaylorAustin那么你应该简单地使用
“mediaType”:${variable}
,但老实说,我会使用
“mediaType”\s*:\s*“{variable}”
,因为它考虑到了空格分隔两个值的可能性(假设这是可能的和预期的)。此外,您应该使用
.escape
函数(单击您的问题被标记为重复的链接)。没有必要转义
,因为它在正则表达式中没有特殊意义。但是,如果您需要在javascript中转义它,您可以这样做,尽管我只是简单地使用
,或者保留模板文本:
新正则表达式(`\\\\\\\\\\\\\\\“${escapeRegex(变量)}\\\\\\\\\”)
为了避免混淆
/
@Bergi这是一个很好的观点,出于习惯,我使用了串联,但他们在问题中使用了模板文本。我将添加它作为替代。