如果在相同的字符類別中包含字符類和否定字符類的速記,是否與點相同。這意味着任何字符?與[ 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