在js中,您必须双击一个点/字符才能获得转义字符。那真是怪了。为什么呢?
JS:
"." == "." // true
"\." == "." // true
"\\." == "." // false
"\a" == "a" // true
在python / php中,它表现得像预期的那样:
"\." == "." // False
在js正则表达式中,它以其他方式工作,多么奇怪:)
"\.".search(/\./) // no hit
"\\.".search(/\./) // hit
更新
像T.J.克劳德正确地提到正则表达式的例子是错的。 \.
正则表达式当然是一个文字点。
正确的例子是:
// Find a literal backslash and a literal dot
"\\.".search(/\\\./) // position 0
// Find a literal Dot
"\\.".search(/\./) // position 1
答案 0 :(得分:7)
在js中,您必须双击一个点/字符才能获得转义字符。
您没有获得“转义字符”。你得到两个字符,一个反斜杠和一个点。点不是“逃脱的”。
序列\.
在JavaScript字符串文字中并不特殊。除the ones defined by the spec之外的任何转义序列都会以静默方式删除转义字符。
您的示例"\." == "."
为true
,因为两个文字都定义了相同的字符串,其中一个字符(一个点)。忽略无效转义。
您的示例"\\." == "."
是false
,因为第一个文字定义了一个字符串,其中包含两个字符(反斜杠和一个点),第二个字符串定义了一个只包含一个字符的字符串(一个点) )。
不同语言对无效转义序列的响应方式因语言而异。有些像JavaScript一样,只是忽略了无效的转义。其他人将无效的转义序列视为反斜杠后跟下一个字符,例如,它们默默地转义反斜杠而不是默默地丢弃转义。
重新表达你的正则表达式:
在js正则表达式中,它以其他方式工作,多么奇怪:)
"\.".search(/\./) // no hit <--- Wrong "\\.".search(/\./) // hit
这是不正确的,第一个也会命中(“不匹配”的返回值是-1
,而不是0
)。 "\.".search(/\./)
的返回值为0
(在索引0处找到匹配,这是有道理的,因为.
是第一个字符)。 "\\.".search(/\./)
的返回值为1
(在索引1处找到匹配,这是有道理的,因为.
是第二个字符。)
当然,您在正则表达式文字中转义.
是完全正确的,因为.
在JavaScript正则表达式中是特殊的。