5

当我们在同一字符类中包含字符类和否定字符类的简写时,它是否与 dot 相同这意味着任何字符?

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

[\s\S] [\w\W][\d\D]一样吗.

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

4

3 回答 3

6

“不”是不一样的。如果您不使用该single line标志(这意味着.不匹配所有),它有一个重要的区别。

[\s\S]您想在.不匹配所有匹配时进行混合匹配时,它会派上用场。

用一个例子来解释它更容易。假设您想要捕获介于aand之间的任何内容b,因此您可以使用模式a(.*?)b(?用于不贪婪的匹配和括号用于捕获内容),但如果有新行假设您不想在同一组中捕获它,所以您可以有另一个正则表达式,如a([\s\S]*?)b.

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

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

在此处输入图像描述

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

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

但是,如果您使用与新行匹配的single line标志.,那么您不需要正则表达式技巧,您可以在下面看到所有内容都是绿色的,并且第 2 组(上面的红色)不匹配:在此处输入图像描述

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

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

在此处输入图像描述

于 2017-05-29T21:17:31.057 回答
1

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

于 2017-05-29T15:59:13.863 回答
0

这 ”。” 与换行符不匹配。即使在 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/ 失败了。

于 2017-05-29T16:11:15.817 回答