是[\ s \ S]是否相同。 (点)?

时间:2017-05-29 15:40:48

标签: regex regex-negation character-class

当我们在同一个字符类中包含字符类和否定字符类的速记时,它是否与点相同。表示任何字符?

我对regex101.com进行了测试,并且匹配了每个字符。

[\s\S] [\w\W][\d\D].相同吗?

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

3 个答案:

答案 0 :(得分:1)

答案是:这取决于 如果你的正则表达式引擎确实匹配每个字符.,那么是,结果是相同的。如果它不是,那么结果就不一样了。例如,标准JavaScript .与换行符不匹配。

答案 1 :(得分:1)

“不”它不一样。如果您没有使用single line标记(意味着.与所有标记不匹配),则会有一个重要区别。

[\s\S].与全部匹配时想要混合匹配时会派上用场。

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

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

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

enter image description here

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

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

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

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

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

enter image description here

答案 2 :(得分:0)

"。"与换行符不匹配。即使在Perl多线匹配中它也不匹配。所以,使用一些像

这样的Perl脚本
keys = ['a', 'b', 'c', 'c']
values = [1, 2, 3, 1]

new_dict = {}

for i in zip(keys, values):
   if i[0] in new_dict:
        new_dict[i[0]] += i[1]
   else:
       new_dict[i[0]] = i[1]

你可以输入一些输入来测试它,如

#!/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/;
}

请用CTRL-D离开,多条记录用三个短划线分隔。以上的输出是

$ cat |./aboveskript.pl
a
b

因此模式/a.b/失败。