Apache commons lang3包下的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