2013-03-25 58 views

回答

55

第一個單一的空白匹配之間的差異,而第二個匹配一個或多個空格。他們是所謂的正則表達式量詞,和他們進行這樣的比賽(從documentation拍攝):

Greedy quantifiers 
X? X, once or not at all 
X* X, zero or more times 
X+ X, one or more times 
X{n} X, exactly n times 
X{n,} X, at least n times 
X{n,m} X, at least n but not more than m times 

Reluctant quantifiers 
X?? X, once or not at all 
X*? X, zero or more times 
X+? X, one or more times 
X{n}? X, exactly n times 
X{n,}? X, at least n times 
X{n,m}? X, at least n but not more than m times 

Possessive quantifiers 
X?+ X, once or not at all 
X*+ X, zero or more times 
X++ X, one or more times 
X{n}+ X, exactly n times 
X{n,}+ X, at least n times 
X{n,m}+ X, at least n but not more than m times 
+8

我一直很喜歡他們如何分別描述每個量詞的貪婪,不情願和佔有慾,然後對所有三個人說完全一樣的話。 ;) – 2013-03-25 22:50:15

2

第一個正則表達式將匹配一個空白字符。第二個正則表達式將不情願地匹配一個或多個空白字符。對於大多數用途來說,這兩個正則表達式非常相似,除了第二種情況,正則表達式可以匹配更多的字符串,如果它阻止正則表達式匹配失敗。從http://www.coderanch.com/t/570917/java/java/regex-difference

+0

劃傷單詞「不情願」。這個問題是關於'\ s +',而不是'\ s +?'就像另一個問題。 – 2013-03-25 23:13:08

30

這兩個replaceAll調用總是會產生相同的結果,無論x是什麼。然而,值得注意的是,兩個正則表達式是不一樣重要的是:

  • \\s - 匹配單個空白字符
  • \\s+ - 相匹配的一個或多個空格字符序列。

在這種情況下,它沒有區別,因爲您用空字符串替換所有內容(儘管從效率的角度來看最好使用\\s+)。如果你用一個非空字符串替換,兩者的行爲會有所不同。

+0

W.r.t您的第一行,如果x是「預訂您的域名並獲取\ n \ n \ n \ n \ n \ n在線今日」。兩者會產生相同的結果嗎? – user3705478 2016-12-15 10:01:26

+2

@ user3705478兩者都會產生相同的結果,即使在彼此之後會有多個空格。區別在於它處​​理的方式。如果你有一組(例如)3個空格直接跟隨另一個\\ s +接受該組,並將其整體變成一個「」,而\\ s將自己處理每個空間。 – Daemun 2017-01-04 09:29:03

7

首先,您需要了解兩個語句的最終輸出將是相同的,即從給定字符串中刪除所有空格。

然而x.replaceAll("\\s+", "");將修剪的空間(如果串可具有多個連續空格)由於更高效的方式潛在更少不會因更換的事實該正則表達式\\s+比賽1或多個空格一次,並用空字符串替換它們。

所以,即使你得到同樣的輸出都最好是使用:

x.replaceAll("\\s+", "");