查找和计算字符串中的字符

为了帮助你查找和计算字符串中的字符,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