說起來,博主使用過的正則場景雖然不多,但是就是在這當中,我發現"\\s+"真好用!
詳解 "\\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();
}
總結
啥也不說了,何不試試呢?
如果您看了本篇博客,覺得對您有所收獲,請點擊下面的 [推薦]
如果您想轉載本博客,請注明出處大卡的博客[http://www.cnblogs.com/jinsdu/]
如果您對本文有意見或者建議,歡迎留言
