[\s\S] 是否与 . (点)?

Is [\s\S] same as . (dot)?

当我们在同一个字符class中包含字符class和否定字符class的shorthand时,是否与点相同。 这意味着任何字符?

我在 regex101.com 上进行了测试,每个字符都匹配。

[\s\S] [\w\W][\d\D] 是否与 . 相同?

我想知道这种行为在 Web 的前端和后端语言中是否持续存在,例如 Javascript、Php、Python 和其他语言。

答案是:视情况而定。
如果您的正则表达式引擎确实将每个字符与 . 匹配,那么是的,结果是相同的。如果不是,那么结果是不一样的。例如,在标准 JavaScript . 中,不匹配换行符。

“.”不匹配换行符。即使在 Perl 多行匹配中,它也不匹配它们。所以,使用像

这样的小 Perl 脚本
#!/usr/bin/perl -w
use strict;
$/="---";
my $i=0;
my $patA='a[\d\D]b';
my $patB='a.b';
while(<>){
    $i++;
    print "$i: $_";
    print "    patA matches\n" if $_ =~ /$patA/;
    print "    patB matches\n" if $_ =~ /$patB/;
}

您可以通过管道传输一些输入来对其进行测试,例如

$ cat |./aboveskript.pl
a
b

请按 CTRL-D 离开,对于多个记录,请用三个破折号分隔它们。上面的输出是

1: a
b
    patA matches

所以模式 /a.b/ 失败了。

"No"不一样。如果你不使用 single line 标志(意味着 . 不匹配所有),它有一个重要的区别。

如果您想在 . 不能全部匹配的情况下进行混合匹配,[\s\S] 会派上用场。

举个例子更容易说明。假设你想捕获 ab 之间的任何内容,那么你可以使用模式 a(.*?)b? 用于非贪婪匹配,括号用于捕获内容),但是如果假设您不想在同一组中捕获它,则有新行,因此您可以使用另一个正则表达式,例如 a([\s\S]*?)b

因此,如果我们使用两种方法创建一个模式,则会导致:

a(.*)b|a([\s\S]*?)b

在这种情况下,如果您看到 scenario in regex101,那么您将有一种丰富多彩且简单的方法来区分场景(在绿色捕获组 #1 和在红色捕获组 #2 中):

因此,总而言之,当您想要匹配多行时,[\s\S] 是一个正则表达式技巧,而 . 不适合您的需要。这基本上取决于您的用例。

但是,如果你使用 single line 标志,其中 . 匹配新行,那么你不需要正则表达式技巧,下面你可以看到所有都是绿色和第 2 组(红色上面)不匹配:

还创建了一个 javascript 性能测试,它影响了大约 25% 的性能:

https://jsperf.com/ss-vs-dot