天天看點

java 字元串操作大全2 split 詳解

Java代碼 

這個輸出是什麼還是編譯出錯?我想那個split方法中的參數要是"s"的話,輸出一定是4了,就是将原來字元串分成了數組{"thi","i","a te","t"},但是原題split方法中的參數要是"/s",那麼這個參數到底是嘛意思呢,實驗後輸出結果居然是1。

原因還得深究啊。

    java.lang.string.split,即split 方法,它實作的功能是将一個字元串分割為子字元串,然後将結果作為字元串數組傳回。 格式為:

                 stringObj.split([separator,[limit]]) 

其中stringObj是必選項,表示要被分解的 String 對象或文字。該對象不會被 split 方法修改。 separator 為可選項,表示字元串或正規表達式對象,它辨別了分隔字元串時使用的是一個還是多個字元。如果忽略該選項,傳回包含整個字元串的單一進制素數組。 limit 為可選項,該值用來限制傳回數組中的元素個數。 值得注意的是: split 方法的結果是一個字元串數組,在 stingObj 中每個出現 separator 的位置都要進行分解,separator 不作為任何數組元素的部分傳回。

一個例子

這樣輸出結果為

另外一個例子

 看看下面這個

因為 public string[] split(string regex) 這裡的參數的名稱是regex ,也就是 regular expression (正規表達式)。這個參數并不是一個簡單的分割用的字元,而是一個正規表達式,以下是split 方法的實作代碼:

   public string[] split(string regex, int limit) { 

        return pattern.compile(regex).split(this, limit); 

   }

split 的實作直接調用的 matcher 類的 split 的方法。我們知道,“ . ”在正規表達式中有特殊的含義,是以我們使用的時候必須進行轉義。 隻要将

改為

就可以了。

那麼這裡在列上一些轉義字元

 \\ 反斜杠 

\t 間隔 ('\u0009')

\n 換行 ('\u000A')

\r 回車 ('\u000D')

\d 數字 等價于 [0-9]

\D 非數字 等價于 [^0-9]

\s 空白符号 [\t\n\x0B\f\r]

\S 非空白符号 [^\t\n\x0B\f\r]

\w 單獨字元 [a-zA-Z_0-9]

\W 非單獨字元 [^a-zA-Z_0-9]

\f 換頁符 

\e Escape

\b 一個單詞的邊界 

\B 一個非單詞的邊界 

\G 前一個比對的結束

注意:public String[] split(String regex,int limit)根據比對給定的正規表達式來拆分此字元串。 

此方法傳回的數組包含此字元串的每個子字元串,這些子字元串由另一個比對給定的表達式的子字元串終止或由字元串結束來終止。數組中的子字元串按它們在此字元串中的順序排列。如果表達式不比對輸入的任何部分,則結果數組隻具有一個元素,即此字元串。 

limit 參數控制模式應用的次數,是以影響結果數組的長度。如果該限制 n 大于 0,則模式将被最多應用 n - 1 次,數組的長度将不會大于 n,而且數組的最後項将包含超出最後比對的定界符的所有輸入。如果 n 為非正,則模式将被應用盡可能多的次數,而且數組可以是任意長度。如果 n 為零,則模式将被應用盡可能多的次數,數組可有任何長度,并且結尾空字元串将被丢棄。

回到最初的題目,題目中給出的比對正規表達式為"/s",表示空白字元,此時給定的字元串中沒有比對的字元,則輸出為原字元串,是以輸出的字元長度為1.

再附上一些關于java中正規表達式的知識吧

^ 為限制開頭 

^java     條件限制為以 Java 為開頭字元 

$ 為限制結尾 

java$     條件限制為以 java 為結尾字元 

.  條件限制除 \n 以外任意一個單獨字元 

java..     條件限制為 java 後除換行外任意兩個字元

加入特定限制條件「 [] 」 

[a-z]     條件限制在小寫 a to z 範圍中一個字元 

[A-Z]     條件限制在大寫 A to Z 範圍中一個字元 

[a-zA-Z] 條件限制在小寫 a to z 或大寫 A to Z 範圍中一個字元 

[0-9]     條件限制在小寫 0 to 9 範圍中一個字元 

[0-9a-z] 條件限制在小寫 0 to 9 或 a to z 範圍中一個字元 

[0-9[a-z]] 條件限制在小寫 0 to 9 或 a to z 範圍中一個字元 ( 交集 )

[] 中加入 ^ 後加再次限制條件「 [^] 」 

[^a-z]     條件限制在非小寫 a to z 範圍中一個字元 

[^A-Z]     條件限制在非大寫 A to Z 範圍中一個字元 

[^a-zA-Z] 條件限制在非小寫 a to z 或大寫 A to Z 範圍中一個字元 

[^0-9]     條件限制在非小寫 0 to 9 範圍中一個字元 

[^0-9a-z] 條件限制在非小寫 0 to 9 或 a to z 範圍中一個字元 

[^0-9[a-z]] 條件限制在非小寫 0 to 9 或 a to z 範圍中一個字元 ( 交集 )

在限制條件為特定字元出現 0 次以上時,可以使用「 * 」 

J*     0 個以上 J

.*     0 個以上任意字元 

J.*D     J 與 D 之間 0 個以上任意字元 

在限制條件為特定字元出現 1 次以上時,可以使用「 + 」 

J+     1 個以上 J

.+     1 個以上任意字元 

J.+D     J 與 D 之間 1 個以上任意字元 

在限制條件為特定字元出現有 0 或 1 次以上時,可以使用「 ? 」 

JA?     J 或者 JA 出現

限制為連續出現指定次數字元「 {a} 」 

J{2}     JJ

J{3}     JJJ

文字 a 個以上,并且「 {a,} 」 

J{3,}     JJJ,JJJJ,JJJJJ,???(3 次以上 J 并存 )

文字個以上, b 個以下「 {a,b} 」 

J{3,5}     JJJ 或 JJJJ 或 JJJJJ

兩者取一「 | 」 

J|A     J 或 A

Java|Hello     Java 或 Hello

「 () 」中規定一個組合類型 

比如,我查詢 <a href=\"index.html\">index</a> 中 <a href></a> 間的資料,可寫作 <a.*href=\".*\">(.+?)</a>

在使用 Pattern.compile 函數時,可以加入控制正規表達式的比對行為的參數: 

Pattern Pattern.compile(String regex, int flag)

flag 的取值範圍如下: 

Pattern.CANON_EQ     當且僅當兩個字元的 " 正規分解 (canonical decomposition)" 都完全相同的情況下,才認定比對。比如用了這個标志之後,表達式 "a\u030A" 會比對 "?" 。預設情況下,不考慮 " 規範相等性 (canonical equivalence)" 。 

Pattern.CASE_INSENSITIVE(?i)     預設情況下,大小寫不明感的比對隻适用于 US-ASCII 字元集。這個标志能讓表達式忽略大小寫進行比對。要想對 Unicode 字元進行大小不明感的比對,隻要将 UNICODE_CASE 與這個标志合起來就行了。 

Pattern.COMMENTS(?x)     在這種模式下,比對時會忽略 ( 正規表達式裡的 ) 空格字元 ( 譯者注:不是指表達式裡的 "\\s" ,而是指表達式裡的空格, tab ,回車之類 ) 。注釋從 # 開始,一直到這行結束。可以通過嵌入式的标志來啟用 Unix 行模式。

Pattern.DOTALL(?s)     在這種模式下,表達式 '.' 可以比對任意字元,包括表示一行的結束符。預設情況下,表達式 '.' 不比對行的結束符。 

Pattern.MULTILINE

(?m)     在這種模式下, '^' 和 '$' 分别比對一行的開始和結束。此外, '^' 仍然比對字元串的開始, '$' 也比對字元串的結束。預設情況下,這兩個表達式僅僅比對字元串的開始和結束。 

Pattern.UNICODE_CASE

(?u)     在這個模式下,如果你還啟用了 CASE_INSENSITIVE 标志,那麼它會對 Unicode 字元進行大小寫不明感的比對。預設情況下,大小寫不敏感的比對隻适用于 US-ASCII 字元集。 

Pattern.UNIX_LINES(?d)     在這個模式下,隻有 '\n' 才被認作一行的中止,并且與 '.' , '^' ,以及 '$' 進行比對。

抛開空泛的概念,下面寫出幾個簡單的 Java 正則用例: 

◆ 比如,在字元串包含驗證時 

// 查找以 Java 開頭 , 任意結尾的字元串 

  Pattern pattern = Pattern.compile("^Java.*");

  Matcher matcher = pattern.matcher("Java 不是人 ");

  boolean b= matcher.matches();

  // 當條件滿足時,将傳回 true ,否則傳回 false

  System.out.println(b);

◆ 以多條件分割字元串時 

Pattern pattern = Pattern.compile("[, |]+");

String[] strs = pattern.split("Java Hello World  Java,Hello,,World|Sun");

for (int i=0;i<strs.length;i++) {

    System.out.println(strs[i]);

◆ 文字替換(首次出現字元) 

Pattern pattern = Pattern.compile(" 正規表達式 ");

Matcher matcher = pattern.matcher(" 正規表達式 Hello World, 正規表達式 Hello World");

// 替換第一個符合正則的資料 

System.out.println(matcher.replaceFirst("Java"));

◆ 文字替換(全部) 

System.out.println(matcher.replaceAll("Java"));

◆ 文字替換(置換字元) 

Matcher matcher = pattern.matcher(" 正規表達式 Hello World, 正規表達式 Hello World ");

StringBuffer sbr = new StringBuffer();

while (matcher.find()) {

    matcher.appendReplacement(sbr, "Java");

}

matcher.appendTail(sbr);

System.out.println(sbr.toString());

◆ 驗證是否為郵箱位址 

String str="[email protected]";

Pattern pattern = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher(str);

System.out.println(matcher.matches());

◆ 去除 html 标記 

Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);

Matcher matcher = pattern.matcher("<a href=\"index.html\"> 首頁 </a>");

String string = matcher.replaceAll("");

System.out.println(string);

◆ 查找 html 中對應條件字元串 

Pattern pattern = Pattern.compile("href=\"(.+?)\"");

if(matcher.find())

  System.out.println(matcher.group(1));

◆ 截取 http:// 位址 

// 截取 url

Pattern pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:]+");

Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");

StringBuffer buffer = new StringBuffer();

while(matcher.find()){              

    buffer.append(matcher.group());        

    buffer.append("\r\n");              

System.out.println(buffer.toString());

◆ 替換指定 {} 中文字 

String str = "Java 目前的發展史是由 {0} 年 -{1} 年 ";

String[][] object={new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}};

System.out.println(replace(str,object));

public static String replace(final String sourceString,Object[] object) {

            String temp=sourceString;    

            for(int i=0;i<object.length;i++){

                      String[] result=(String[])object[i];

               Pattern    pattern = Pattern.compile(result[0]);

               Matcher matcher = pattern.matcher(temp);

               temp=matcher.replaceAll(result[1]);

            }

            return temp;

◆ 以正則條件查詢指定目錄下檔案 

 // 用于緩存檔案清單 

        private ArrayList files = new ArrayList();

        // 用于承載檔案路徑 

        private String _path;

        // 用于承載未合并的正則公式 

        private String _regexp;

        class MyFileFilter implements FileFilter {

              /**

               * 比對檔案名稱 

               */

              public boolean accept(File file) {

                try {

                  Pattern pattern = Pattern.compile(_regexp);

                  Matcher match = pattern.matcher(file.getName());                

                  return match.matches();

                } catch (Exception e) {

                  return true;

                }

              }

        /**

         * 解析輸入流 

         * @param inpu