2017-05-29 78 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感謝您的評論,它總是非常酷的學習 –