BreakIterator
は、文字、単語、行、および文章の間の可能な休憩を見つけるために使用することができます。これは、カーソルを表示可能な文字に移動する、ダブルクリックして単語を選択する、トリプルクリックしてセンテンスを選択する、行折り返しなどの場合に便利です。
ボイラープレートコード
次のコードは、以下の例で使用しています。最初の部分を調整してテキストを変更し、BreakIterator
と入力してください。
// change these two lines for the following examples
String text = "This is some text.";
BreakIterator boundary = BreakIterator.getCharacterInstance();
// boiler plate code
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;
}
あなたはこのをテストしたい場合は、活動のonCreate
Androidの中に直接貼り付けることができます。私はLog
ではなくSystem.out.println
を使用しているため、Javaのみの環境でもテスト可能です。
私はICUのものではなく、java.text.BreakIterator
を使用しています。これはAPI 24からのみ利用できます。詳細については、下のリンクをご覧ください。
文字
変更定型コードが含まれるように、次の
String text = "English中文123éé\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値で構成されていても、これらの文字はすべて1文字と解釈されます。以下を含むように
言葉
変更定型コード:
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
に設定したとしても、これは私のテストではまだ真実でした。
行
あなたは言葉の例と同じコードを維持することができます
0 I
2 like
7 to
10 eat
14 apples.
22 我
23 喜
24 欢
25 吃
26 苹
27 果。
注
String text = "I like to eat apples. 我喜欢吃苹果。";
BreakIterator boundary = BreakIterator.getLineInstance();
出力ブレークの位置は、テキストの行全体ではないこと。それらはテキストを折り返すだけの便利な場所です。
出力は単語の例に似ています。しかし、空白と句読点はその前の単語に含まれています。新しい行を空白や句読点で始めることを望まないため、これは意味があります。また、中国語の文字はすべての文字に改行が付くことに注意してください。これは、中国語の複数行にわたる複数の単語を壊すことは問題ではないという事実と一致しています。
文
変更以下を含むように定型的なコードは:
String text = "I like to eat apples. My email is [email protected]\n" +
"This is a new paragraph. 我喜欢吃苹果。我不爱吃臭豆腐。";
BreakIterator boundary = BreakIterator.getSentenceInstance();
出力
![image to represent text output](https://i.stack.imgur.com/duDUK.png)
正しい文分割は、複数の言語で認識されました。また、電子メールドメイン内のドットについて偽陽性はなかった。
ノート
あなたがBreakIterator
を作成するときには、Localeを設定することができますが、そうでない場合はそれだけでdefault localeを使用しています。さらに
中国語のテキストを単語に分割することが正しく機能していません。 https://stackoverflow.com/questions/44507838/breakiterator-not-working-correctly-with-chinese-textでご覧いただけますか? – srgsanky