如果在相同的字符类别中包含字符类和否定字符类的速记,是否与点相同。这意味着任何字符?与[ s S]相同。 (点)?
我做了一个测试regex101.com和每个字符匹配。
是[\s\S]
[\w\W]
和[\d\D]
是否与.
相同?
我想知道,如果这种行为在Web前端和后端语言如Javascript,Php,Python等中是持久的。
如果在相同的字符类别中包含字符类和否定字符类的速记,是否与点相同。这意味着任何字符?与[ s S]相同。 (点)?
我做了一个测试regex101.com和每个字符匹配。
是[\s\S]
[\w\W]
和[\d\D]
是否与.
相同?
我想知道,如果这种行为在Web前端和后端语言如Javascript,Php,Python等中是持久的。
答案是:这取决于。
如果你的正则表达式匹配.
的每个字符,那么是的,结果是一样的。如果不是,那么结果就不一样了。例如,在标准JavaScript .
中,不匹配换行符。
“。”与换行符不匹配。即使在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/;
}
一个小Perl脚本,你可以管一些输入以测试它像
$ cat |./aboveskript.pl
a
b
请CTRL-d离开,多个记录有三个破折号分开。上面的输出是
1: a
b
patA matches
所以模式/a.b/失败。
“不”它是不一样的。如果不使用single line
标志(意思是.
不全部匹配),它有一个重要区别。
[\s\S]
当你想在.
不匹配所有匹配的情况下进行匹配混合时很方便。
用一个例子来解释它很容易。假设您想要捕获a
和b
之间的任何内容,因此您可以使用a(.*?)b
(?
用于捕获内容的非理性匹配和括号),但是如果有新行假设您不希望捕获它们组,所以你可以有另一个正则表达式,如a([\s\S]*?)b
。
因此,如果我们创建一个使用一个模式都接近它导致:
a(.*)b|a([\s\S]*?)b
在这种情况下,如果你看到scenario in regex101,那么你将有一个丰富多彩,简单的方法(在绿色捕获组#1和红色捕获组#2中):
因此,我n的结论,[\s\S]
是一个正则表达式的技巧,当你想匹配多行和.
不适合你的需求。它基本上取决于你的用例。
但是,如果您使用single line
标志,在.
匹配新的生产线,那么你不需要正则表达式的绝招,下面你可以看到,所有的绿色和第2组(上面红色)不匹配:
还创建了一个JavaScript性能测试,它的影响在性能25%左右:
当您需要“混合匹配”时,在PHP中,您可以使用'(?s:。*?)现在,将DOTALL模式(? - s:。*)转到行尾。“还有更多事实上,它。在Python中,你不能使用修饰符组,然后''\ d \ D]'真的非常方便。在JS中,'[\ s \ S]'仍然是一个解决方法,因为它的本地'[^]'完成了这项工作。 '[\ s \ S]'是跨NFA正则表达式的可移植构造,这就是它如此受欢迎的原因。 –
嘿@WiktorStribiżew感谢您的评论,它总是非常酷的学习 –
HTTP:/ /www.regular-expressions.info/dot.html – Bergi
我想知道这里会有什么样的答案。这听起来太宽泛了,因为没有指出正则表达式的味道。 “取决于”的答案对未来的访问者并不真正有帮助。一个点在Perl引发的正则表达式引擎中的匹配方式相当不同,但是类似于结构的构造在POSIX和非基于POSIX的正则表达式引擎中的行为也不一样。 –
@WiktorStribiżew:更新我的问题。 – Rahul