編程比賽中的一道題目
標題:正則表示
正則表達式表示了串的某種規則或規律。恰當地使用正則表達式,可以使得代碼簡潔、事半功倍。java的很多API都支持正則表達式作為參數。其中的String.split就是這樣。
看下面的代碼,其意圖為把一個或多個空格或逗號、句號分開的單詞分離出來。即獲得數組為:
["cat","doc","desk","push","last","this","is","what","must","be"]
請在划線處填入適當代碼,取得要求的效果。
String s = "cat dog,desk push last, this is what. must be";
String[] ss = s.split("______________________________"); //填空位置
for(String k: ss) System.out.println(k);
注意:只提交划線部分缺少的內容,不要寫其它附加內容,比如:說明性的文字或已經存在的代碼。
為了解決上面的題目,查閱了最終的解決方案。
String[] ss1 = s.split("\\W+");
for(String k: ss1) System.out.println("s1:"+k);
通過該操作可以獲得正確結果:
s1:cat
s1:dog
s1:desk
s1:push
s1:last
s1:this
s1:is
s1:what
s1:must
s1:be
另外在獲得正確答案之前,有以下思路:
String[] ss = s.split("\\,|\\s+|\\.");
for(String k: ss) System.out.println(k);
獲得結果如下:
cat
dog
desk
push
last
this
is
what
must
be
注意其中多出了兩行空行,這其實是由於|操作中只能起到單個選項的作用。不能起到並集作用。
可供參考:
特殊字符 |
描述 |
. | 表示任意一個字符 |
[abc] | 表示a、b或c中的任意一個字符 |
[^abc] | 除a、b和c以外的任意一個字符 |
[a-zA-z] | 介於a到z,或A到Z中的任意一個字符 |
\s | 空白符(空格、tab、換行、換頁、回車) |
\S | 非空白符 |
\d | 任意一個數字[0-9] |
\D | 任意一個非數字[^0-9] |
\w | 詞字符[a-zA-Z_0-9] |
\W | 非詞字符 |
表示字符出現次數的符號
表示次數的符號 |
描述 |
* | 0 次或者多次 |
+ | 1 次或者多次 |
? | 0 次或者 1 次 |
{n} | 恰好 n 次 |
{n, m} | 至少 n 次,不多於 m 次 |
public String[] split(String regex)
- 根據給定 正則表達式的匹配拆分此字符串。 其中regex必須為正則表達式。
- 如上面表格,與普通字符串不同,很多字符代表特殊意義,因此如",""."之前都要加上雙右斜線\\,第二個表格中可以規定一個分割符重復的次數,如\\,{4},只有當出現",,,,"分割字符串。
- 使用多個不同字符分割字符串,可以使用|符號連接不同字符。如第二種解決方案,查看結果也會發現,不能同時分割字符串的情況,只能依次按表達式,單獨分次分割字符串,於是出現了兩行空格。
- 另外單獨使用|分割字符串時記得使用\\|。
- 在完成上面題目時前面被“把一個或多個空格或逗號、句號分開的單詞分離出來”誤導,於是出現了第二種解決方案,其實我們並沒有注意到如第一個表格中的特殊含義字符,使用這些特殊字符搭配第二個表格的出現次數符號,很容解決了上面的問題。
- 不知道你是否理解了呢?如果還不理解,可以試着先使用單獨字符試驗一遍,在搭配不同字符,由簡入繁,獲得最終理想的結果。