当我们在同一字符类中包含字符类和否定字符类的简写时,它是否与 dot 相同。这意味着任何字符?
我在regex101.com上进行了测试,每个字符都匹配。
[\s\S]
[\w\W]
和[\d\D]
一样吗.
?
我想知道这种行为是否在 Web 的前端和后端语言(如 Javascript、Php、Python 等)中持续存在。
当我们在同一字符类中包含字符类和否定字符类的简写时,它是否与 dot 相同。这意味着任何字符?
我在regex101.com上进行了测试,每个字符都匹配。
[\s\S]
[\w\W]
和[\d\D]
一样吗.
?
我想知道这种行为是否在 Web 的前端和后端语言(如 Javascript、Php、Python 等)中持续存在。
“不”是不一样的。如果您不使用该single line
标志(这意味着.
不匹配所有),它有一个重要的区别。
当[\s\S]
您想在.
不匹配所有匹配时进行混合匹配时,它会派上用场。
用一个例子来解释它更容易。假设您想要捕获介于a
and之间的任何内容b
,因此您可以使用模式a(.*?)b
(?
用于不贪婪的匹配和括号用于捕获内容),但如果有新行假设您不想在同一组中捕获它,所以您可以有另一个正则表达式,如a([\s\S]*?)b
.
因此,如果我们使用这两种方法创建一种模式,则会导致:
a(.*)b|a([\s\S]*?)b
在这种情况下,如果您在 regex101 中看到场景,那么您将有一种丰富多彩且简单的方法来区分场景(绿色捕获组#1 和红色捕获组#2):
因此,总而言之,[\s\S]
当您想要匹配多行并且.
不适合您的需求时,这是一个正则表达式技巧。这基本上取决于您的用例。
但是,如果您使用与新行匹配的single line
标志.
,那么您不需要正则表达式技巧,您可以在下面看到所有内容都是绿色的,并且第 2 组(上面的红色)不匹配:
还创建了一个 javascript 性能测试,它对性能的影响约为 25%:
答案是:视情况而定。
如果您的正则表达式引擎确实匹配每个字符,.
那么是,结果是相同的。如果不是,那么结果是不一样的。例如,在标准 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
所以模式 /ab/ 失败了。