1. 程式人生 > >Java-字串處理

Java-字串處理

字串處理

字串的處理在編寫程式碼中算是比較常見的工作。本篇博文將主要介紹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提供了多種處理字串處理的方法,其主要意圖是:

  1. 找到匹配的字元;
  2. 處理匹配的字元。

對應上面兩種意圖,CharMatcher 內部實現也包含兩部分:

  1. 實現大量共用內部類,用來方便匹配字元;
  2. 實現了許多處理字串的方法,來處理匹配的字元。

常見的方法有:

方法 描述
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
}