[\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]
会派上用场。
举个例子更容易说明。假设你想捕获 a
和 b
之间的任何内容,那么你可以使用模式 a(.*?)b
(?
用于非贪婪匹配,括号用于捕获内容),但是如果假设您不想在同一组中捕获它,则有新行,因此您可以使用另一个正则表达式,例如 a([\s\S]*?)b
。
因此,如果我们使用两种方法创建一个模式,则会导致:
a(.*)b|a([\s\S]*?)b
在这种情况下,如果您看到 scenario in regex101,那么您将有一种丰富多彩且简单的方法来区分场景(在绿色捕获组 #1 和在红色捕获组 #2 中):
因此,总而言之,当您想要匹配多行时,[\s\S]
是一个正则表达式技巧,而 .
不适合您的需要。这基本上取决于您的用例。
但是,如果你使用 single line
标志,其中 .
匹配新行,那么你不需要正则表达式技巧,下面你可以看到所有都是绿色和第 2 组(红色上面)不匹配:
还创建了一个 javascript 性能测试,它影响了大约 25% 的性能:
当我们在同一个字符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]
会派上用场。
举个例子更容易说明。假设你想捕获 a
和 b
之间的任何内容,那么你可以使用模式 a(.*?)b
(?
用于非贪婪匹配,括号用于捕获内容),但是如果假设您不想在同一组中捕获它,则有新行,因此您可以使用另一个正则表达式,例如 a([\s\S]*?)b
。
因此,如果我们使用两种方法创建一个模式,则会导致:
a(.*)b|a([\s\S]*?)b
在这种情况下,如果您看到 scenario in regex101,那么您将有一种丰富多彩且简单的方法来区分场景(在绿色捕获组 #1 和在红色捕获组 #2 中):
因此,总而言之,当您想要匹配多行时,[\s\S]
是一个正则表达式技巧,而 .
不适合您的需要。这基本上取决于您的用例。
但是,如果你使用 single line
标志,其中 .
匹配新行,那么你不需要正则表达式技巧,下面你可以看到所有都是绿色和第 2 组(红色上面)不匹配:
还创建了一个 javascript 性能测试,它影响了大约 25% 的性能: