2017-05-29 80 views
0

如果在相同的字符类别中包含字符类和否定字符类的速记,是否与点相同。这意味着任何字符?与[ s S]相同。 (点)?

我做了一个测试regex101.com和每个字符匹配。

[\s\S][\w\W][\d\D]是否与.相同?

我想知道,如果这种行为在Web前端和后端语言如Javascript,Php,Python等中是持久的。

+2

HTTP:/ /www.regular-expressions.info/dot.html – Bergi

+0

我想知道这里会有什么样的答案。这听起来太宽泛了,因为没有指出正则表达式的味道。 “取决于”的答案对未来的访问者并不真正有帮助。一个点在Perl引发的正则表达式引擎中的匹配方式相当不同,但是类似于结构的构造在POSIX和非基于POSIX的正则表达式引擎中的行为也不一样。 –

+0

@WiktorStribiżew:更新我的问题。 – Rahul

回答

1

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

+1

在大多数其他语言中,'.'默认情况下不会匹配换行符,但可以使用标志来改变此行为。 – Aaron

+0

*如果您的正则表达式引擎匹配每个字符都带有'。',那么是的,结果是一样的。* - '.'仅与基于POSIX的正则表达式引擎匹配,然后'[\ s \ S]'被解析为文字'''''和's' /'S' - 答案是* no *。 –

+0

@WiktorStribiżew:在我的[test](https://regex101.com/r/SjRUx0/2/)'[\ s \ S] '不作为文字字符 – Rahul

0

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

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

因此,我n的结论,[\s\S]是一个正则表达式的技巧,当你想匹配多行和.不适合你的需求。它基本上取决于你的用例。

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

还创建了一个JavaScript性能测试,它的影响在性能25%左右:

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

enter image description here

+0

当您需要“混合匹配”时,在PHP中,您可以使用'(?s:。*?)现在,将DOTALL模式(? - s:。*)转到行尾。“还有更多事实上,它。在Python中,你不能使用修饰符组,然后''\ d \ D]'真的非常方便。在JS中,'[\ s \ S]'仍然是一个解决方法,因为它的本地'[^]'完成了这项工作。 '[\ s \ S]'是跨NFA正则表达式的可移植构造,这就是它如此受欢迎的原因。 –

+0

嘿@WiktorStribiżew感谢您的评论,它总是非常酷的学习 –