BreakIterator
可用于查找字符、单词、行和句子之间的可能断点。这对于通过可见字符移动光标,双击选择单词,三击选择句子和换行等操作非常有用。
样板代码
以下代码在下面的示例中使用。只需调整第一部分以更改 BreakIterator
的文本和类型即可。
String text = "This is some text.";
BreakIterator boundary = BreakIterator.getCharacterInstance();
boundary.setText(text);
int start = boundary.first();
for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) {
System.out.println(start + " " + text.substring(start, end));
start = end;
}
如果您只想测试一下,可以直接将它粘贴到 Android 中的 Activity 的 onCreate
中。我使用了 System.out.println
而不是 Log
,这样它也可在仅 Java 环境中进行测试。
我使用的是 java.text.BreakIterator
,而不是 ICU 版本,ICU 版本只能从 API 24 开始使用。有关更多信息,请参见底部链接。
Characters
更改样板代码以包括以下内容
String text = "Hi 中文éé\uD83D\uDE00\uD83C\uDDEE\uD83C\uDDF3."
BreakIterator breakIterator = BreakIterator.getCharacterInstance()
输出
0 H
1 i
2
3 中
4 文
5 é
6 é
8
10
14 .
最有趣的部分位于索引6
、8
和10
。您的浏览器可能会正确显示这些字符,也可能不会,但用户会将它们解释为单个字符,即使它们由多个UTF-16值组成。
词汇
更改模板代码以包括以下内容:
String text = "I like to eat apples. 我喜欢吃苹果。"
BreakIterator boundary = BreakIterator.getWordInstance()
输出
0 I
1
2 like
6
7 to
9
10 eat
13
14 apples
20 .
21
22 我
23 喜欢
25 吃
26 苹果
28 。
这里有几个有趣的事情需要注意。首先,在空格的两侧都检测到了单词中断。其次,即使有不同的语言,也可以识别出多个字符的中文单词。即使我将区域设置为 Locale.US
,在我的测试中仍然如此。
行
你可以像单词示例一样保持代码不变:
String text = "I like to eat apples. 我喜欢吃苹果。"
BreakIterator boundary = BreakIterator.getLineInstance()
输出
0 I
2 like
7 to
10 eat
14 apples.
22 我
23 喜
24 欢
25 吃
26 苹
27 果。
请注意,断点位置不是整行文本。它们只是方便的文本换行位置。
输出与“Words”示例类似。但现在包括了单词前面的空格和标点符号。这是有道理的,因为你不希望新的一行以空格或标点符号开头。还要注意,每个中文字符都有换行符。这是符合事实的,因为在中文中跨行拆分多字符单词是可以接受的。
句子
更改样板代码以包含以下内容:
String text = "I like to eat apples. My email is me@example.com.\n" +
"This is a new paragraph. 我喜欢吃苹果。我不爱吃臭豆腐。"
BreakIterator boundary = BreakIterator.getSentenceInstance()
输出
0 I like to eat apples.
22 My email is me@example.com.
50 This is a new paragraph.
75 我喜欢吃苹果。
82 我不爱吃臭豆腐。
正确的句子分割在多种语言中都得到了认可。此外,在电子邮件域中没有出现错误的正点。
注释
您可以在创建BreakIterator
时设置Locale,但如果没有设置,则使用默认的locale。
进一步阅读