出自:
http://www.tuicool.com/articles/vy2ymm
詳解 "\\s+"
正則表達式中\s匹配任何空白字符,包括空格、制表符、換頁符等等, 等價於[ \f\n\r\t\v]
- \f -> 匹配一個換頁
- \n -> 匹配一個換行符
- \r -> 匹配一個回車符
- \t -> 匹配一個制表符
- \v -> 匹配一個垂直制表符
而“\s+”則表示匹配任意多個上面的字符。另因為反斜杠在Java里是轉義字符,所以在Java里,我們要這么用“\\s+”.
那么問題來了,“\\s+”有啥使用場景呢?
API測試中,替換測試模板中的數據
在API自動化測試中,我們經常要用xml,或者json文件,來保存API payload。 比如下面這個模板:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <userInvite> <toEmail>xxxx@gmail.com</toEmail> <toUserId>%s</toUserId> <fromUserId>%s</fromUserId> <groupId>123</groupId> <inviteMetadataId>1</inviteMetadataId> <status>created</status> <clilentId>xxxx</clilentId> <inviteProperties> <inviteProperty> <key>key</key> <value>value</value> </inviteProperty> <inviteProperty> <key>subject</key> <value>is inviting you</value> </inviteProperty> </inviteProperties> </userInvite>
而在測試的時候,我們就經常要替換模板中的數據,去測試API的邏輯。比如我要去掉key為subject的inviteProperty, 然后再Call這個API,怎么辦呢?
OK,答案很明顯,我們只要替換他們就可以了,而這時候\\s+就可以派上用場了。
比如我們可以直接將其替換成空格:
payload.replaceFirst("<inviteProperty>\\s+<key>subject</key>\\s+<value>is inviting you</value>\\s+</inviteProperty>", "");
這里的\\s+可以替換掉關鍵字之間的所有空白字符。
\\s+在經典算法題:單詞反轉中的使用
有這么一個經典算法題:
輸入一串字符,然后按着單詞倒敘輸出
比如:
輸入 "the sky is blue",
輸出 "blue is sky the".
這題如果使用String的Split方法就非常方便,我們可以根據空格把字符串分成單詞數組,這樣就可以倒着輸出單詞就可以了。
但是如果單純的使用空格就會有很多缺陷,比如:
s.trim().split(" ");
如果輸入為這樣就會有問題 “a b”,用上面的代碼,我們就會分拆出下面的結果:

最后分解出了四個元素!
很明顯跟我們的預期不一樣,我們希望是只剩兩個單詞,所以如果使用\\s+,一切就完美多了!

最后給出完整算法解決方案:
public static String reverseWords(String s) { String[] wordsArray = s.trim().split("\\s+"); StringBuilder result = new StringBuilder(); for(int i = wordsArray.length - 1; i >= 0 ; i--) { if(i == 0) { result.append(wordsArray[i]); } else { result.append(wordsArray[i] + " "); } } return result.toString(); }