PHP正则表达式:\s和\\s的区别

7

我理解 \s 用于匹配空格字符,但有时我会看到在 preg_match 中使用 "\\s" 并且能够正常工作。例如:

if (preg_match("/\\s/", $myString)) {
   // there are spaces
}

if (preg_match("/\s/", $myString)) {
   // there are spaces
}

上述两个代码块有什么区别吗?

@Tushar:如果"\s" => 正则表达式 s,那么为什么 preg_match("/\s/", "hello hi") = 1? - joHN
@joHN:当 ("/\s/", "hello hi") = 1 时,输出是正确的,因为只有一个空格。第一个表达式将尝试在字符串中匹配 \s。可以在 https://regex101.com/ 进行尝试。 - rock321987
@Tushar:尝试使用var_dump(preg_match("/\s/","\shello",$matches)); - joHN
@Tushar:能否提供一个示例字符串,使得上面的代码块会产生不同的结果? - joHN
2
不要在任何在线网站上尝试这个..请在本地编译器上尝试..我在我的Python控制台中尝试后明白了OP的问题。 - rock321987
在Python中,有类似于r"\\s"的东西,可以用来显示结果的差异...不过我不知道PHP是否也有这个。 - rock321987
2个回答

4

试着理解手册中的文字。

http://php.net/manual/en/regexp.reference.escape.php

在单引号和双引号的 PHP 字符串中,反斜杠有特殊含义。 如果需要将反斜杠 \ 与正则表达式匹配,则必须在 PHP 代码中使用 "\\\\" 或 '\\\\'。

我可能不是正确的,但我尝试一下。

当你使用类似于

preg_match("/\\s/", $myString)

它的作用是将 \\ 转换为 \,然后使字符串变成 \s,因此它的含义不会改变,创建的正则表达式在内部匹配 "spaces",即 '/\s/'。如果要在字符串中匹配 \s,您需要执行以下操作:
preg_match("/\\\\s/", $myString)

因此,在正则表达式字符串中,\s或\\s的答案没有任何区别。个人认为使用\s更简单易懂。


即使我使用单引号来指定模式,我没有看到任何区别。我的意思不是匹配"\s",而是匹配空格。所以在使用\s和\s(双引号或单引号)之间没有区别吗? - joHN
@joHN,这就是手册所说的,无论是单引号还是双引号都不重要,反斜杠在PHP字符串中具有特殊含义,它会转义所有非字母字符。反斜杠本身也是一个非字母字符,所以它被转换成反斜杠,并且当编译器遇到一个反斜杠后跟着“s”时,它会尝试匹配空格。 - codisfy
1
两种模式都能工作的真正原因是PHP保留了未知转义序列中的反斜杠。对于未知的转义序列,行为是未定义的,PHP的作者(以及Python的作者)决定保留反斜杠,而在JavaScript中,这些单个反斜杠在C字符串中被省略了。为了避免歧义,最好在双引号模式中使用双反斜杠。 - Wiktor Stribiżew
@WiktorStribiżew,请原谅我的无知,但我认为我不完全理解您所说的“在JavaScript中,这些单个反斜杠在C字符串中被省略。最好在双引号模式中使用双反斜杠以避免歧义”。1.什么是C字符串? 2.我们试图防止什么样的歧义?对于PHP而言,在正则表达式中单引号和双引号是否都可以起到同样的作用?如果您能提供参考资料或示例,那就太好了! - codisfy
C字符串可以包含转义序列(例如\n表示LF等)。您不能在文字中声明它们(原义字符串文字,术语可能不同)。在PHP中,即使在双引号和单引号字符串文字中\b仍然是一个单词边界,我亲自测试过,感到非常惊讶。请注意,在JS、Java、Python中,正常字符串文字中的\b是退格字符。因此,在PHP中的歧义是由引擎本身解决的。 - Wiktor Stribiżew

1
\s  - to match all white spaces

\\s - to match all white spaces

\\\s - to match all \s

我没明白,你能给我一个例子字符串吗?其中两个模式会返回不同的结果吗? - joHN
请在您的本地系统中尝试,在线工具无法正确显示独特性。我认为它没有任何区别。 - joHN
编辑后,结果是正确的。\s 和 \s 表达式之间没有区别。 - joHN
是的,我只在在线工具中进行了检查。抱歉。 - Rogin Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接