1. 程式人生 > >StringUtils工具類常用方法彙總(判空、轉換、移除、替換、反轉)

StringUtils工具類常用方法彙總(判空、轉換、移除、替換、反轉)

Apache commons lang3包下的StringUtils工具類中封裝了一些字串操作的方法,非常實用,使用起來也非常方便。最近自己也經常在專案中使用到了裡面的一些方法,在這裡將常用的方法總結了一下,方便以後查閱,大家有興趣也可以看一下。

  首先需要說明的一點是,StringUtils類在操作字串時,即使操作的為null值也是安全的,不會報NullPointerException,這一點在後面的例子中再具體說明。因此,在操作字串時使用StringUtils相比使用原生的String會更加安全。

一、判空(這應該是最常用的)

  StringUtils中判斷字串是否為空的方法主要有以下幾個:

    1boolean StringUtils.isBlank(String str)
    2boolean StringUtils.isEmpty(String str)         
    3boolean StringUtils.isNotBlank(String
str) 4boolean StringUtils.isNotEmpty(String str) 5boolean StringUtils.isAnyBlank(CharSequence… css) 6boolean StringUtils.isAnyEmpty(CharSequence… css) 7boolean StringUtils.isNoneBlank(CharSequence… css) 8boolean StringUtils.isNoneEmpty(CharSequence… css) 9boolean StringUtils.isWhitespace(CharSequence cs)

  很顯然上面的方法很多都是是非的關係,isBlank與isNotBlank,isEmpty與isNotEmpty,isAnyBlank與isNoneBlank,isAnyEmpty與isNoneEmpty都是如此。

  但是blank與empty以及whitesapce它們之間有何區別呢?看下面的對比就很清楚了:

    StringUtils.isBlank(""); // true
    StringUtils.isBlank(" "); // true
    StringUtils.isBlank("     "); // true
    StringUtils.isBlank("\t"); // true
StringUtils.isBlank("\r"); // true StringUtils.isBlank("\n"); // true StringUtils.isBlank(null); // true StringUtils.isEmpty(""); // true StringUtils.isEmpty(" "); // false StringUtils.isEmpty(" "); // false StringUtils.isEmpty("\t"); // false StringUtils.isEmpty("\r"); // false StringUtils.isEmpty("\n"); // false StringUtils.isEmpty(null); // true StringUtils.isWhitespace(""); // true StringUtils.isWhitespace(" "); // true StringUtils.isWhitespace(" "); // true StringUtils.isWhitespace("\t"); // true StringUtils.isWhitespace("\r"); // true StringUtils.isWhitespace("\n"); // true StringUtils.isWhitespace(null); // false

  從上面的結果可以看出,
    blank:代表的是空串("")、空白符(空格""," ",製表符"\t",回車符"\r","\n"等)以及null值;
    empty:代表的是空串("")和null值,不包含空白符;
    whitespace:包含空串("")和空白符,不包含null值.

  isBlank,isNotBlank,isEmpty,isNotEmpty四個方法都是用於判斷單個字串是否為空,這個可以參見上面的幾個例子。

  isAnyBlank,isNoneBlank,isAnyEmpty,isNoneEmpty四個方法是用於判斷多個字串是否為空;
  對於isAnyBlank和isAnyEmpty來說,只要有一個字串為空,結果即為true;
對於isNoneBlank和isNoneEmpty,只要存在一個字串為空,結果即為false,具體參見下面的例子:

    StringUtils.isAnyBlank("titanic", "jack", "rose")); // false
    StringUtils.isAnyBlank("", "jack", "rose")); // true
    StringUtils.isAnyBlank(" ", "jack", "rose")); // true
    StringUtils.isAnyBlank(null, "jack", "rose")); // true

    StringUtils.isAnyEmpty("titanic", "jack", "rose")); // false
    StringUtils.isAnyEmpty("", "jack", "rose")); // true
    StringUtils.isAnyEmpty(" ", "jack", "rose")); // false
    StringUtils.isAnyEmpty(null, "jack", "rose")); // true

    StringUtils.isNoneBlank("titanic", "jack", "rose")); // true
    StringUtils.isNoneBlank("", "jack", "rose")); // false
    StringUtils.isNoneBlank(" ", "jack", "rose")); // false
    StringUtils.isNoneBlank(null, "jack", "rose")); // false

    StringUtils.isNoneEmpty("titanic", "jack", "rose")); // true
    StringUtils.isNoneEmpty("", "jack", "rose")); // false
    StringUtils.isNoneEmpty(" ", "jack", "rose")); // true
    StringUtils.isNoneEmpty(null, "jack", "rose")); // false

二、轉換

  StringUtils中涉及大小寫轉換以及判斷字串大小寫的方法如下:

    1)StringUtils.capitalize(String str)
    2)StringUtils.uncapitalize(String str)
    3)StringUtils.upperCase(String str)
    4)StringUtils.upperCase(String str,Locale locale)
    5)StringUtils.lowerCase(String str)
    6)StringUtils.lowerCase(String str,Locale locale)
    7)StringUtils.swapCase(String str)
    8)StringUtils.isAllUpperCase(CharSequence cs)
    9)StringUtils.isAllLowerCase(CharSequence cs)

  (1)字串首字母大小寫轉換

    StringUtils.capitalize(null)); // null (注意此處不會報異常)
    StringUtils.capitalize("china")); // China (首字母轉大寫)
    StringUtils.uncapitalize(null)); // null  
    StringUtils.uncapitalize("CHINA")); // cHINA (首字母轉小寫)

  (2)字串整體大小寫轉換

    StringUtils.upperCase(null)); // null
    StringUtils.upperCase("china")); // CHINA (全部轉為大寫)
    StringUtils.upperCase("china", Locale.ENGLISH)); // CHINA (按照指定規則轉換為大寫)
    StringUtils.lowerCase(null)); // null
    StringUtils.lowerCase("CHINA")); // china (全部轉換為小寫)
    StringUtils.lowerCase("CHINA", Locale.ENGLISH)); // china (按照指定轉換規則轉換為小寫)
 

  (3)字串大小寫互換

    StringUtils.swapCase(null)); // null
    StringUtils.swapCase("chINA")); // CHina

  (4)判斷字串是否全部是大寫或小寫(空或空白符均為false)

    StringUtils.isAllUpperCase(null)); // false
    StringUtils.isAllUpperCase("")); // false
    StringUtils.isAllUpperCase(" ")); // false
    StringUtils.isAllUpperCase("CHINA")); // true
    StringUtils.isAllLowerCase(null)); // false
    StringUtils.isAllLowerCase("")); // false
    StringUtils.isAllLowerCase(" ")); // false
    StringUtils.isAllLowerCase("china")); // true

三、移除

  從字串中移除匹配的字元或字元序列,如果要移除的字元或字元序列在字串中不存在,即無匹配,則不進行移除

    1)StringUtils.remove(String str, char remove)
    2)StringUtils.remove(String str, String remove)
    3)StringUtils.removeStart(String str, String remove)
    4)StringUtils.removeStartIgnoreCase(String str, String remove)
    5)StringUtils.removeEnd(String str, String remove)
    6)StringUtils.removeEndIgnoreCase(String str, String remove)
    7)StringUtils.deleteWhitespace(String str)

  (1)移除單個字元

    StringUtils.remove(null, 'a')); // null (注意此處及下一行為null)
    StringUtils.remove('china', null) // china 
    StringUtils.remove("china", 'i')); // chna
    StringUtils.remove("china", 'b')); // china (如果要移除的字元不存在,則返回原字串)

  (2)移除指定字元序列

    StringUtils.remove("china", "in")); // cha
    StringUtils.remove("china", "nin")); // china

  (3)移除開頭匹配的字元序列

    StringUtils.removeStart("china", "ch")); // ina
    StringUtils.removeStartIgnoreCase("china", "CHI")); // na (忽略大小寫)

  (4)移除結尾匹配的字元序列

    StringUtils.removeEnd("china", "na")); // chi
    StringUtils.removeEndIgnoreCase("china", "NA")); // chi (忽略大小寫)

  (5)移除空白字元

    StringUtils.deleteWhitespace(null)); //null
    StringUtils.deleteWhitespace(" c h  i\tn\ra")); // china

四、替換

  StringUtils中常用的替換方法有如下幾種

    1)replace(String text, String searchString, String replacement)
    2replace(String text, String searchString, String replacement, int max)
    3)replaceChars(String str, char searchChar, char replaceChar)
    4)replaceChars(String str, String searchChars, String replaceChars)
    5)replaceOnce(String text, String searchString, String replacement)
    6)overlay(String str,String overlay,int start,int end)
    7)replaceEach(String text, String[] searchList, String[] replacementList)
    8)replaceEachRepeatedly(String text, String[] searchList, String[]replacementList)

  需要注意的是,若被替換的字串為null,或者被替換的字元或字元序列為null,又或者替換的字元或字元序列為null,那麼此次替換都會被忽略,返回原字串

  (1)替換單個字元或字元序列

    (a)replace方法

      replace方法可以替換單個字元序列

        StringUtils.replace("china", null, "z")); // china (此處被替換字元序列為null,因此替換會被忽略,返回原字串)
        StringUtils.replace("china", "c", null)); // china (此處替換字元序列為null,因此替換也被忽略,返回原字串)
        StringUtils.replace("china", "a", "ese")); // chinese
        StringUtils.replace("china", "a", "")); // chin

      replace方法還可以指定最大替換的個數

        StringUtils.replace("aabaaa", "a", "z", 0)); // aabaaa (0表示替換的個數為0,也就是不替換)
        StringUtils.replace("aabaaa", "a", "z", 1)); // zabaaa (1表示最多替換1個)
        StringUtils.replace("aabaaa", "a", "z", 2)); // zzbaaa (2表示最多替換2個)
        StringUtils.replace("aabaaa", "a", "z", 3)); // zzbzaa (3表示最多替換3個)
        StringUtils.replace("aabaaa", "a", "z", -1)); // zzbzaa (-1表示全部替換)

    (b)replaceChars方法

      replaceChars方法可以替換單個字元或者單個字元序列

        StringUtils.replaceChars("china", 'a', 'z')); // chinz
        StringUtils.replaceChars("china", "a", "z")); // chinz

    (c)replaceOnce方法

      replaceOnce方法只會替換一次,也就是隻會替換第一個要替換的字元序列,後面即使有匹配的字元序列也不會被替換

        StringUtils.replaceOnce("abaa", "a", "z")); // zbaa

    (d)overlay方法

      overlay(String str,String overlay,int start,int end)方法可以在指定位置進行字元序列替換,從start索引處開始(包含)到end-1索引處為止進行替換

         StringUtils.overlay("abcdef", "zzzz", 2, 4)); // abzzzzef

      這裡有一些特殊情況:

      1)起始索引start小於結束索引end,這時會將end作為起始索引,start作為結束索引

         StringUtils.overlay("abcdef", "zzzz", 4, 2)); // abzzzzef
         StringUtils.overlay("abcdef", "zzzz", 4, 3)); // abczzzzef
         StringUtils.overlay("abcdef", "zzzz", 4, 4)); // abcdzzzzef
         StringUtils.overlay("abcdef", "zzzz", 4, 5)); // abcdzzzzf

      2)起始索引start為負數,這時start會被當作0處理

         StringUtils.overlay("abcdef", "zzzz", -1, 2)); // abcdzz
         StringUtils.overlay("abcdef", "zzzz", -2, -3)); // zzzzabcdef

      3)結束索引end大於原始字串的長度,這時end會被當作原始字串長度處理

         StringUtils.overlay("abcdef", "zzzz", 8, 10)); // abcdefzzzz

  (2)同時替換多個字元序列

    (a)replaceEach方法

      replaceEach(String text, String[] searchList, String[] replacementList)方法可以同時替換多個字元序列,但被替換和替換的字元序列的個數應該對應,否則會報IllegalArgumentException

         StringUtils.replaceEach("china", new String[] { "ch", "a" }, new String[] { "x", "z" })); // xhinz (將ch和a分別替換為x和z)
         StringUtils.replaceEach("china", null, new String[] { "x", "z" })); // china (存在null,不進行替換)
         StringUtils.replaceEach("china", new String[] { "ch", "a" }, new String[] { "x", "z", "y" })); // IllegalArgumentException (被替換和替換的個數不對應)
           

    (b)replaceEachRepeatedly方法

      replaceEachRepeatedly(String text, String[] searchList, String[] replacementList)方法可以迴圈進行替換,具體見下面的例子:

           StringUtils.replaceEachRepeatedly("china", new String[] { "c", "x" }, new String[] { "x", "z" })); // zhina (c被替換為x,x又被替換為z)

      但如果替換是一個死迴圈,則會報IllegalStateException:

           StringUtils.replaceEachRepeatedly("china", new String[] { "c", "x" }, new String[] { "x", "c" })); // IllegalStateException (c被替換為x,x又被替換為c)

五、反轉

  StringUtils中有關反轉的方法如下:

    1)reverse(String str)
    2)reverseDelimited(String str, char separatorChar)

  (1)簡單反轉

  reverse(String str)方法

    StringUtils.reverse("china")); // anihc

  (2)根據指定分隔符進行反轉,分隔符之間的字元不進行反轉

    StringUtils.reverseDelimited("china", ',')); // china
    StringUtils.reverseDelimited("cxhinxa", 'x')); // axhinxz
    StringUtils.reverseDelimited("c.hin.a", '.')); // a.hin.c
    StringUtils.reverseDelimited("c.hina", '.')); // hina.c
這次再彙總一下其它常用的方法。

一、擷取

  StringUtils中常用的擷取字串的方法如下:

substring(String str,int start)
substring(String str,int start, int end)
substringAfter(String str,String separator)
substringAfterLast(String str,String separator)
substringBefore(String str,String separator)
substringBeforeLast(String str,String separator)
substringBetween(String str,String tag)

  需要注意的是,擷取字串時,若被擷取的字串為null或"",則擷取之後的返回的字串也為null和""

  (1)根據指定位置擷取字串,當指定的擷取位置為非負數時,則從左往右開始擷取,第一位為0,後面依次類推,但當索引值為負數時,則從右往左擷取,注意此時右側第一位為-1

    a)只指定了起始位置,則擷取至字串末尾:

StringUtils.substring(null, 2); // "" null和""擷取後都返回null和""
StringUtils.substring(null, 2); // null
StringUtils.substring("china", 0); // china 指定的起始擷取位置為0,則從第一位開始擷取,也就是不擷取
StringUtils.substring("china", 2); // ina 指定的擷取位置為2,則從左往右第三位開始擷取
StringUtils.substring("china", -2); // na 指定的擷取位置為-2,則從右往左第二位開始擷取

    b)指定了起始位置和結束位置,則從起始位置開始擷取到結束位置(但不包含結束位置):

StringUtils.substring(null, 2, 4); // null null和""擷取後都返回null和""
StringUtils.substring("", 2, 4); // ""
StringUtils.substring("china", 0, 0); // ""
StringUtils.substring("china", 2, 4); // in
StringUtils.substring("china", -2, -4); // in
StringUtils.substring("china", 2, -3); // ""
StringUtils.substring("china", 2, -1); // in

    (2)根據指定的分隔符進行擷取(不包含該分隔符):
      a)從分隔符第一次出現的位置向後擷取:

StringUtils.substringAfter("china", "i"); // na 從第一次出現"i"的位置向後擷取,不包含第一次出現的"i"
StringUtils.substringAfter("china", "hi"); // na
StringUtils.substringAfter("chinachina","h")); // inachina
StringUtils.substringAfter("china", "a"); // ""
StringUtils.substringAfter("china", "d"); // "" 分隔符在要擷取的字串中不存在,則返回""
StringUtils.substringAfter("china", "")); // china 分隔符為"",則返回原字串
Stringtils.substringAfter("china", null); // "" 分隔符為null,則返回""

      b)從分隔符最後一次出現的位置向後擷取:

StringUtils.substringAfterLast("china", "i"); // na
StringUtils.substringAfterLast("chinachina", "i"); // na "i"最後出現的位置向後擷取

      c)從分隔符第一次出現的位置向前擷取:

StringUtils.substringBefore("china", "i"); // ch 
StringUtils.substringBefore("chinachina", "i"); // ch 從"i"第一次出現的位置向前擷取

      d)從分隔符最後一次出現的位置向前擷取:

StringUtils.substringBeforeLast("china", "i");
StringUtils.substringBeforeLast("chinachina", "i"); // chinach

      e)擷取指定標記字串之間的字元序列:

StringUtils.substringBetween(null, "ch") // null
StringUtils.substringBetween("", "") // ""
StringUtils.substringBetween("tagabctag", "") // "" 標記字串為"",則擷取後返回""
StringUtils.substringBetween("", "tag") // null // 注意此處返回的是null
StringUtils.substringBetween("tagabctag", null) // null 標記字串為null,則擷取後返回null
StringUtils.substringBetween("tagabctag", "tag") // "abc"

二、去除空白:

  去除字串中的空白符是我們在處理字串時經常遇到的問題,StringUtils中也封裝了一些非常好用的方法來幫助我們解決這個問題:

trim(String str)
trimToEmpty(String str)
trimToNull(String str)
strip(String str)
stripToEmpty(String str)
stripToNull(String str)
deleteWhitespace(String str)

  (1)去除字串首尾的控制符(char ≤ 32)
    a)trim(String str):如果被去除的字串的為null或"",則返回null和"":

StringUtils.trim(null); // null
StringUtils.trim(""); // ""
StringUtils.trim("     ");// ""
StringUtils.trim("abc");