我有这个正则表达式:
regex = new RegExp("\${")
和这个字符串:
path = "${wf:conf('oozie.wf.application.path')}/workflows/core"
当我针对正则表达式测试字符串时:
regex .test(path)
它返回false,为什么?
答案 0 :(得分:4)
你的正则表达式相当于${
。即你正在寻找字符串的结尾,后跟一个永远不匹配的{
。
就像在正则表达式中一样,在字符串文字中使用\
来转义特殊字符或创建特殊的转义序列。 E.g。
> 'foo\'bar'
"foo'bar"
但是,如果您尝试转义不特殊的字符或创建无效的转义序列,则反斜杠就会被丢弃:
> 'foob\ar'
"foobar"
这意味着,如果您使用字符串文字来构造正则表达式,并且您希望"转发"表达式的反斜杠,你也必须转义它:
new RegExp("\\${")
您可以在控制台中创建表达式并说服自己:
> RegExp("\${")
/${/
> /${/
/${/
> RegExp("\\${")
/\${/
> /\${/
/\${/
使用正则表达式文字真的很简单:
var regex = /\${/;
答案 1 :(得分:1)
您需要使用双\
来创建\${
,因为\
是字符串文字转义字符。
您需要一个字符串\${
作为正则表达式,在字符串文字中表示\
,您需要使用\\
作为单个\
将表现为逃脱符号
regex = new RegExp("\\${")
答案 2 :(得分:1)
你能解释一下我为什么要使用双斜线?我用一个来逃避
$
,为什么第二个?
让我们再举一个例子。 "\n"
是字符串中的转义序列,生成换行符。为了在字符串中生成序列\n
(反斜杠,然后是n
),您需要转义反斜杠:"\\n"
。要生成与字符串\n
(反斜杠,n
)匹配的正则表达式,您不能使用new RegExp("\\n")
,因为这将创建\
的新正则表达式和n
(字符串转义的结果);但是regexp再次将\
和n
解释为换行符。所以你需要双重转义:一次告诉字符串你想要一个字面反斜杠,并再一次说服regexp你也想要一个字面反斜杠。因此,要匹配后跟n
的反斜杠,您需要执行以下操作:
new Regexp("\\\\n")
相当于
/\\n/
将匹配foo
中的字符串
console.log(foo)
// => \n
在你的例子中,它不是逃逸的反斜杠,而是一美元;只有正则表达式需要逃避。但是你需要确保你逃脱美元的反斜杠能够在字符串文字的转义机制中存活下来:
"\\$"
将包含两个字符:反斜杠和$
,并且构造的regexp将等同于/\$/
。但是如果你从字符串"\$"
开始,它等同于"$"
,因为美元不需要在常规字符串中转义;并且由此创建的正则表达式将匹配行的结尾,而不是美元符号。