StringUtils工具類常用方法彙總(判空、轉換、移除、替換、反轉)
首先需要說明的一點是,StringUtils類在操作字串時,即使操作的為null值也是安全的,不會報NullPointerException,這一點在後面的例子中再具體說明。因此,在操作字串時使用StringUtils相比使用原生的String會更加安全。
一、判空(這應該是最常用的)
StringUtils中判斷字串是否為空的方法主要有以下幾個:
1)boolean StringUtils.isBlank(String str)
2)boolean StringUtils.isEmpty(String str)
3)boolean StringUtils.isNotBlank(String str)
4)boolean StringUtils.isNotEmpty(String str)
5)boolean StringUtils.isAnyBlank(CharSequence… css)
6)boolean StringUtils.isAnyEmpty(CharSequence… css)
7)boolean StringUtils.isNoneBlank(CharSequence… css)
8)boolean StringUtils.isNoneEmpty(CharSequence… css)
9)boolean 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)
2)replace(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");