Java-字串處理
阿新 • • 發佈:2019-02-07
字串處理
字串的處理在編寫程式碼中算是比較常見的工作。本篇博文將主要介紹Google Guava 中對字串進行處理的工具包的使用。
- 準備工作
在 maven專案中匯入guava依賴。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
聯結器[Joiner]
@Test
public void test() {
//連線字串中的非空字串
Joiner joiner = Joiner.on("->").skipNulls();
System.out.println(joiner.join("Messi", null, "Henry", "Lionel"));//Messi->Henry->Lionel
//用指定字串,如A 替換空字串
joiner = Joiner.on("->").useForNull("A");
System.out.println(joiner.join("Messi", null , "Henry", "Lionel"));//Messi->A->Henry->Lionel
//陣列轉換為字串,中間以逗號隔開
System.out.println(Joiner.on(",").join(Arrays.asList(1, 2, 3)));//1,2,3
}
拆分器[Splitter]
- 拆分器方法。
方法 | 描述 | 範例 |
---|---|---|
Splitter.on(char) | 按單個字元拆分 | Splitter.on(‘,’) |
Splitter.on(CharMatcher) | 按字元匹配器拆分 | Splitter.on(CharMatcher.BREAKING_WHITESPACE) |
Splitter.on(String) | 按字串拆分 | Splitter.on(“abc“) |
Splitter.on(Pattern),Splitter.onPattern(String) | 按正則表示式拆分 | Splitter.onPattern(“\r?\n”) |
Splitter.fixedLength(int) | 按固定長度拆分;最後一段可能比給定長度短,但不會為空。 | Splitter.fixedLength(3) |
- 拆封器修飾符
方法 | 描述 |
---|---|
omitEmptyStrings() | 從結果中自動忽略空字串 |
trimResults() | 移除結果字串的前導空白和尾部空白 |
trimResults(CharMatcher) | 給定匹配器,移除結果字串的前導匹配字元和尾部匹配字元 |
limit(int) | 限制拆分出的字串數量 |
- 程式碼示例
@Test
public void test1() {
String[] res = " foo,bar,, qux ".split(",");
for (String item : res) {
System.out.print(item + "->");//foo->bar->-> qux->
}
//忽略字串中的所有空串
Iterable<String> iterable = Splitter.on(",").trimResults().omitEmptyStrings().split(" foo,bar,, qux ");
for (String item : iterable) {
System.out.print(item + "->");//foo->bar->qux->
}
}
字元匹配器[CharMatcher]
CharMatcher提供了多種處理字串處理的方法,其主要意圖是:
- 找到匹配的字元;
- 處理匹配的字元。
對應上面兩種意圖,CharMatcher 內部實現也包含兩部分:
- 實現大量共用內部類,用來方便匹配字元;
- 實現了許多處理字串的方法,來處理匹配的字元。
常見的方法有:
方法 | 描述 |
---|---|
removeFrom(CharSequence) | 從字元序列中移除所有匹配字元。 |
retainFrom(CharSequence) | 在字元序列中保留匹配字元,移除其他字元。 |
trimFrom(CharSequence) | 移除字元序列的前導匹配字元和尾部匹配字元。 |
matchesAllOf(CharSequence) | 測試是否字元序列中的所有字元都匹配。 |
下面來看看對 CharMatcher 的示例,中間含有對應的註釋,可以很好地理解程式的意思。
@Test
public void test3() {
//去掉控制符,如(\t,\n,\b,...)
String noControl = CharMatcher.JAVA_ISO_CONTROL.removeFrom("messi\t\n");
System.out.println(noControl);//messi
//只保留數字字元
String theDigits = CharMatcher.DIGIT.retainFrom("messi1 2 3");
System.out.println(theDigits);//123
//去掉兩端的空格,並把中間的連續空格替換成單個空格
String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(" me ssi", '/');
System.out.println(spaced);//me/ssi
//所有數字替換成*
String noDigits = CharMatcher.JAVA_DIGIT.replaceFrom("messi123431j", '*');
System.out.println(noDigits);//messi******j
//只保留數字和小寫字母
String lowerAndDigit = CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom("MessiF123Fne");
System.out.println(lowerAndDigit);//essi123ne
//獲取所有的大寫字母
String digit = CharMatcher.JAVA_UPPER_CASE.retainFrom("JiangF123Fne");
System.out.println(digit);//JFF
//列舉匹配字元
String anyOf = CharMatcher.anyOf("aeiou").retainFrom("good");
System.out.println(anyOf);//oo
//單一字元匹配
String isChar = CharMatcher.is('a').retainFrom("goaad");
System.out.println(isChar);//aa
//給定字元範圍匹配
String inRange = CharMatcher.inRange('a', 'z').retainFrom("adfc1234fg45d");
System.out.println(inRange);//adfcfgd
}
字符集[Charsets]
@Test
public void test4() {
String str = "中國";
/*try {
byte[] bytes = str.getBytes("UTF-8");
for (byte byte1 : bytes) {
System.out.print(byte1 + " ");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}*/
//顯然第二種方法更加簡便
byte[] bytes = str.getBytes(Charsets.UTF_8);
for (byte byte1 : bytes) {
System.out.print(byte1 + " ");
}
}
以上兩種方法的結果是一樣的,很明顯,第二種方法不用處理異常,更加簡便。
大小寫格式[CaseFormat]
格式 | 說明 |
---|---|
LOWER_CAMEL | Java變數的命名規則,如“lowerCamel”。 |
LOWER_HYPHEN | 連字元連線變數的命名規則,如“lower-hyphen”。 |
LOWER_UNDERSCORE | C ++變數命名規則,如“lower_underscore”。 |
UPPER_CAMEL | Java和C++類的命名規則,如“UpperCamel”。 |
UPPER_UNDERSCORE | Java和C++常量的命名規則,如“UPPER_UNDERSCORE”。 |
@Test
public void test5() {
String text = "lionel_messi";
String text1 = "lionel-messi";
String upperUnderscore = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "LionelMessi");//
System.out.println(upperUnderscore);
System.out.println(CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, text1));//lionelMessi
System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, text));//lionelMessi
System.out.println(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, text));//LionelMessi
}