查詢和計算字串中的字元

為了幫助你查詢和計算字串中的字元,CharMatcher 提供了以下方法:

  • int indexIn(CharSequence sequence)
    返回與 CharMatcher 例項匹配的第一個字元的索引。如果沒有字元匹配,則返回 -1。

  • int indexIn(CharSequence sequence, int start)
    返回與 CharMatcher 例項匹配的指定起始位置後的第一個字元的索引。如果沒有字元匹配,則返回 -1。

  • int lastIndexIn(CharSequence sequence)
    返回與 CharMatcher 例項匹配的最後一個字元的索引。如果沒有字元匹配,則返回 -1。

  • int countIn(CharSequence sequence)
    返回與 CharMatcher 例項匹配的字元數。

使用這些方法,這是一個名為 NonAsciiFinder 的簡單控制檯應用程式,它將字串作為輸入引數。首先,它列印出字串中包含的非 ASCII 字元的總數。隨後,它列印出它遇到的每個非 ASCII 字元的 Unicode 表示。這是程式碼:

import com.google.common.base.CharMatcher;

public class NonAsciiFinder {
    private static final CharMatcher NON_ASCII = CharMatcher.ascii().negate();

    public static void main(String[] args) {
        String input = args[0];
        int nonAsciiCount = NON_ASCII.countIn(input);

        echo("Non-ASCII characters found: %d", nonAsciiCount);

        if (nonAsciiCount > 0) {
            int position = -­1;
            char character = 0;

            while (position != NON_ASCII.lastIndexIn(input)) {
                position = NON_ASCII.indexIn(input, position + 1);
                character = input.charAt(position);
                
                echo("%s => \\u%04x", character, (int) character);
            }
        }
    }

    private static void echo(String s, Object... args) {
        System.out.println(String.format(s, args));
    }
}

請注意,在上面的示例中,你可以通過呼叫 negate 方法簡單地反轉 CharMatcher。類似地,下面的 CharMatcher 匹配所有雙寬字元,並且通過否定預定義的 CharMatcher 來建立單寬字元。

final static CharMatcher DOUBLE_WIDTH = CharMatcher.singleWidth().negate();

執行 NonAsciiFinder 應用程式會產生以下輸出:

$> java NonAsciiFinder "Maître Corbeau, sur un arbre perché"
Non­-ASCII characters found: 2
î => \u00ee
é => \u00e9
$> java NonAsciiFinder "古池や蛙飛び込む水の音"
Non­ASCII characters found: 11
古 => \u53e4
池 => \u6c60
や => \u3084
蛙 => \u86d9
飛 => \u98db
び => \u3073
込 => \u8fbc
む => \u3080
水 => \u6c34
の => \u306e
音 => \u97f3