-3

在 js 中,您必须对点/字符进行双重转义才能获得转义字符。这很奇怪。为什么?

js:

"." == "." // true
"\." == "." // true
"\\." == "." // false

"\a" == "a" // true

在 python/php 中,它的行为与预期的一样:

"\." == "." // False

在 js 正则表达式中它以其他方式工作,多么奇怪:)

"\.".search(/\./)  // no hit
"\\.".search(/\./) // hit

更新

就像 TJ Crowder 正确地提到正则表达式示例是错误的一样。正\.则表达式当然匹配文字点。

正确的例子是:

// Find a literal backslash and a literal dot
"\\.".search(/\\\./) // position 0

// Find a literal Dot
"\\.".search(/\./) // position 1
4

1 回答 1

7

在 js 中,您必须对点/字符进行双重转义才能获得转义字符。

您不会得到“转义字符”。你得到两个字符,一个反斜杠和一个点。点没有“转义”。

该序列\.在 JavaScript 字符串文字中并不特殊。除规范定义的转义序列外,任何转义序列都会默默地删除转义字符。

您的示例"\." == "."true因为两种文字都定义了相同的字符串,该字符串具有一个字符(一个点)。无效的转义被忽略。

您的示例"\\." == "."false因为第一个文字定义了一个包含两个字符(反斜杠和一个点)的字符串,第二个定义了一个只有一个字符的字符串(一个点)。

不同的语言如何响应无效的转义序列因语言而异。有些,比如 JavaScript,只是忽略了无效的转义。其他人将无效的转义序列视为反斜杠后跟下一个字符,例如,他们默默地转义反斜杠而不是默默地放弃转义。


重新您的正则表达式示例:

在 js 正则表达式中它以其他方式工作,多么奇怪:)

"\.".search(/\./)  // no hit    <--- Wrong
"\\.".search(/\./) // hit

这是不正确的,第一个也命中(“不匹配”的返回值是-1, not 0)。"\.".search(/\./)is的返回值0(在索引 0 处找到匹配项,这是有道理的,因为.is 是第一个字符)。"\\.".search(/\./)is的返回值1(在索引 1 处找到匹配项,这是有道理的,因为.is 是第二个字符)。

当然,你.在正则表达式文字中转义是非常正确的,因为在 JavaScript 正则表达式中. 是特殊的。

于 2013-05-15T11:33:58.557 回答