正則表達式與java String.split()


編程比賽中的一道題目

標題:正則表示

正則表達式表示了串的某種規則或規律。恰當地使用正則表達式,可以使得代碼簡潔、事半功倍。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},只有當出現",,,,"分割字符串。
  使用多個不同字符分割字符串,可以使用|符號連接不同字符。如第二種解決方案,查看結果也會發現,不能同時分割字符串的情況,只能依次按表達式,單獨分次分割字符串,於是出現了兩行空格。
另外單獨使用|分割字符串時記得使用\\|。
  在完成上面題目時前面被“把一個或多個空格或逗號、句號分開的單詞分離出來”誤導,於是出現了第二種解決方案,其實我們並沒有注意到如第一個表格中的特殊含義字符,使用這些特殊字符搭配第二個表格的出現次數符號,很容解決了上面的問題。
  
  不知道你是否理解了呢?如果還不理解,可以試着先使用單獨字符試驗一遍,在搭配不同字符,由簡入繁,獲得最終理想的結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM