当我们在同一个字符类中包含字符类和否定字符类的速记时,它是否与点相同。表示任何字符?
我对regex101.com进行了测试,并且匹配了每个字符。
[\s\S]
[\w\W]
和[\d\D]
与.
相同吗?
我想知道这种行为是否在网络的前端和后端语言(例如Javascript,Php,Python等)中持续存在。
答案 0 :(得分:1)
答案是:这取决于
如果你的正则表达式引擎确实匹配每个字符.
,那么是,结果是相同的。如果它不是,那么结果就不一样了。例如,标准JavaScript .
与换行符不匹配。
答案 1 :(得分:1)
“不”它不一样。如果您没有使用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%:
答案 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/失败。