java.lang.Object
java.text.BreakIterator
- 所有已实现的接口:
-
Cloneable
BreakIterator类实现了用于查找文本边界位置的方法。 BreakIterator的实例保持当前位置并扫描文本,返回边界出现的字符索引。在内部,BreakIterator使用CharacterIterator扫描文本,因此能够扫描由实现该协议的任何对象持有的文本。使用StringCharacterIterator来扫描传递给setText的String对象。
您可以使用此类提供的工厂方法来创建各种类型的断句器实例。特别地,使用getWordInstance、getLineInstance、getSentenceInstance和getCharacterInstance来分别创建执行单词、行、句子和字符边界分析的BreakIterator。单个BreakIterator只能处理一个单元(单词、行、句子等)。您必须为要执行的每个单元边界分析使用不同的迭代器。
行边界分析确定文本字符串在换行时可以断开的位置。该机制正确处理标点符号和连字符词。实际的换行还需要考虑可用的行宽,并由更高级别的软件处理。
句子边界分析允许正确解释数字和缩写中的句号,以及引号和括号等尾部标点符号的选择。
单词边界分析用于搜索和替换功能,以及在允许用户双击选择单词的文本编辑应用程序中。单词选择提供对单词内部和后续标点符号的正确解释。不属于单词的字符,如符号或标点符号,在两侧都有单词分隔。
字符边界分析允许用户按预期与字符交互,例如,通过文本字符串移动光标时。字符边界分析提供对字符字符串的正确导航,无论字符如何存储。返回的边界可能是辅助字符、组合字符序列或连字簇的边界。例如,一个带重音符号的字符可能被存储为基本字符和一个变音符号。用户认为的字符在不同语言之间可能有所不同。
- 实现要求:
-
字符边界分析的默认实现符合Unicode Consoritum的扩展字形集群断点。更多细节,请参考Unicode标准附录#29中的字形集群边界部分。
此类的工厂方法返回的
BreakIterator实例仅用于自然语言,而不用于编程语言文本。但是可以定义子类来对编程语言进行标记化。示例:
创建和使用文本边界:
按顺序打印每个元素:public static void main(String args[]) { if (args.length == 1) { String stringToExamine = args[0]; //按顺序打印每个单词 BreakIterator boundary = BreakIterator.getWordInstance(); boundary.setText(stringToExamine); printEachForward(boundary, stringToExamine); //按相反顺序打印每个句子 boundary = BreakIterator.getSentenceInstance(Locale.US); boundary.setText(stringToExamine); printEachBackward(boundary, stringToExamine); printFirst(boundary, stringToExamine); printLast(boundary, stringToExamine); } }
按相反顺序打印每个元素:public static void printEachForward(BreakIterator boundary, String source) { int start = boundary.first(); for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) { System.out.println(source.substring(start,end)); } }
打印第一个元素:public static void printEachBackward(BreakIterator boundary, String source) { int end = boundary.last(); for (int start = boundary.previous(); start != BreakIterator.DONE; end = start, start = boundary.previous()) { System.out.println(source.substring(start,end)); } }
打印最后一个元素:public static void printFirst(BreakIterator boundary, String source) { int start = boundary.first(); int end = boundary.next(); System.out.println(source.substring(start,end)); }
打印指定位置的元素:public static void printLast(BreakIterator boundary, String source) { int end = boundary.last(); int start = boundary.previous(); System.out.println(source.substring(start,end)); }
查找下一个单词:public static void printAt(BreakIterator boundary, int pos, String source) { int end = boundary.following(pos); int start = boundary.previous(); System.out.println(source.substring(start,end)); }(由BreakIterator.getWordInstance()返回的迭代器在于其返回的断点位置不代表正在迭代的事物的起始和结束。也就是说,句子断点迭代器返回的断点分别代表一个句子的结束和下一个句子的开始。对于单词断点迭代器,两个边界之间的字符可能是一个单词,也可能是两个单词之间的标点符号或空格。上述代码使用简单的启发式方法来确定哪个边界是单词的开始:如果此边界和下一个边界之间的字符包含至少一个字母(可以是字母、CJK表意文字、Hangul音节、Kana字符等),则此边界和下一个之间的文本是一个单词;否则,它是两个单词之间的内容。)public static int nextWordStartAfter(int pos, String text) { BreakIterator wb = BreakIterator.getWordInstance(); wb.setText(text); int last = wb.following(pos); int current = wb.next(); while (current != BreakIterator.DONE) { for (int p = last; p < current; p++) { if (Character.isLetter(text.codePointAt(p))) return last; } last = current; current = wb.next(); } return BreakIterator.DONE; } - 自版本:
- 1.1
- 参见:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int当到达第一个或最后一个文本边界时,previous()、next()、next(int)、preceding(int)和following(int)会返回DONE。 -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionclone()创建此迭代器的副本abstract intcurrent()返回最近由next()、next(int)、previous()、first()、last()、following(int)或preceding(int)返回的文本边界的字符索引。abstract intfirst()返回第一个边界。abstract intfollowing(int offset) 返回指定字符偏移量后的第一个边界。static Locale[]返回此类的get*Instance方法可以返回本地化实例的所有区域设置的数组。static BreakIterator返回默认区域设置的字符断点的新BreakIterator实例。static BreakIteratorgetCharacterInstance(Locale locale) 返回给定区域设置的字符断点的新BreakIterator实例。static BreakIterator返回默认区域设置的行断点的新BreakIterator实例。static BreakIteratorgetLineInstance(Locale locale) 返回给定区域设置的行断点的新BreakIterator实例。static BreakIterator返回默认区域设置的句子断点的新BreakIterator实例。static BreakIteratorgetSentenceInstance(Locale locale) 返回给定区域设置的句子断点的新BreakIterator实例。abstract CharacterIteratorgetText()获取正在扫描的文本static BreakIterator返回默认区域设置的单词断点的新BreakIterator实例。static BreakIteratorgetWordInstance(Locale locale) 返回给定区域设置的单词断点的新BreakIterator实例。booleanisBoundary(int offset) 如果指定的字符偏移量是文本边界,则返回true。abstract intlast()返回最后一个边界。abstract intnext()返回当前边界之后的边界。abstract intnext(int n) 返回当前边界之后的第n个边界。intpreceding(int offset) 返回指定字符偏移之前的最后一个边界。abstract intprevious()返回当前边界之前的边界。void设置要扫描的新文本字符串。abstract voidsetText(CharacterIterator newText) 设置要扫描的新文本。
-
Field Details
-
DONE
public static final int DONE当到达第一个或最后一个文本边界时,previous()、next()、next(int)、preceding(int)和following(int)会返回DONE。- 参见:
-
-
Constructor Details
-
BreakIterator
protected BreakIterator()构造函数。BreakIterator是无状态的,没有默认行为。
-
-
Method Details
-
clone
创建此迭代器的副本。 -
first
public abstract int first()返回第一个边界。将迭代器的当前位置设置为第一个文本边界。- 返回:
- 第一个文本边界的字符索引。
-
last
public abstract int last()返回最后一个边界。将迭代器的当前位置设置为最后一个文本边界。- 返回:
- 最后一个文本边界的字符索引。
-
next
public abstract int next(int n) 返回当前边界之后的第n个边界。如果已经到达第一个或最后一个文本边界,则返回BreakIterator.DONE,并将当前位置设置为第一个或最后一个文本边界,具体取决于到达的是哪一个。否则,将当前位置设置为新的边界。例如,如果迭代器的当前位置是第m个文本边界,并且从当前边界到最后一个文本边界存在三个边界,则next(2)调用将返回m + 2。新的文本位置设置为第(m + 2)个文本边界。调用next(4)将返回BreakIterator.DONE,并且最后一个文本边界将成为新的文本位置。- 参数:
-
n- 要返回的边界。值为0时不执行任何操作。负值移动到前一个边界,正值移动到后一个边界。 - 返回:
- 当前位置之后第n个边界的字符索引,如果已经到达第一个或最后一个文本边界,则返回BreakIterator.DONE。
-
next
public abstract int next()返回当前边界之后的边界。如果当前边界是最后一个文本边界,则返回BreakIterator.DONE,并且迭代器的当前位置不变。否则,将迭代器的当前位置设置为当前边界之后的边界。- 返回:
- 下一个文本边界的字符索引,如果当前边界是最后一个文本边界,则返回BreakIterator.DONE。等同于next(1)。
- 参见:
-
previous
public abstract int previous()返回当前边界之前的边界。如果当前边界是第一个文本边界,则返回BreakIterator.DONE,并且迭代器的当前位置不变。否则,将迭代器的当前位置设置为当前边界之前的边界。- 返回:
- 前一个文本边界的字符索引,如果当前边界是第一个文本边界,则返回BreakIterator.DONE。
-
following
public abstract int following(int offset) 返回指定字符偏移之后的第一个边界。如果指定的偏移等于最后一个文本边界,则返回BreakIterator.DONE,并且迭代器的当前位置不变。否则,将迭代器的当前位置设置为返回的边界。返回值始终大于偏移或值BreakIterator.DONE。- 参数:
-
offset- 要开始扫描的字符偏移量。 - 返回:
- 指定偏移量之后的第一个边界,如果将最后一个文本边界作为偏移量传入,则返回BreakIterator.DONE。
- 抛出:
-
IllegalArgumentException- 如果指定的偏移量小于第一个文本边界或大于最后一个文本边界。
-
preceding
public int preceding(int offset) 返回指定字符偏移之前的最后一个边界。如果指定的偏移等于第一个文本边界,则返回BreakIterator.DONE,并且迭代器的当前位置不变。否则,将迭代器的当前位置设置为返回的边界。返回值始终小于偏移或值BreakIterator.DONE。- 参数:
-
offset- 要开始扫描的字符偏移量。 - 返回:
- 指定偏移量之前的最后一个边界,如果将第一个文本边界作为偏移量传入,则返回BreakIterator.DONE。
- 抛出:
-
IllegalArgumentException- 如果指定的偏移量小于第一个文本边界或大于最后一个文本边界。 - 自1.2版本起:
- 1.2
-
isBoundary
public boolean isBoundary(int offset) 如果指定的字符偏移是文本边界,则返回true。- 参数:
-
offset- 要检查的字符偏移量。 - 返回:
- 如果"offset"是边界位置,则返回true,否则返回false。
- 抛出:
-
IllegalArgumentException- 如果指定的偏移量小于第一个文本边界或大于最后一个文本边界。 - 自1.2版本起:
- 1.2
-
current
public abstract int current()返回最近由next()、next(int)、previous()、first()、last()、following(int)或preceding(int)返回的文本边界的字符索引。如果其中任何一个方法返回BreakIterator.DONE,因为已经到达第一个或最后一个文本边界,则返回第一个或最后一个文本边界。- 返回:
- 从上述方法返回的文本边界,第一个或最后一个文本边界。
- 参见:
-
getText
获取正在扫描的文本- 返回:
- 正在扫描的文本
-
setText
设置要扫描的新文本字符串。当前扫描位置重置为第一个文本边界。- 参数:
-
newText- 要扫描的新文本。
-
setText
设置要扫描的新文本。当前扫描位置重置为第一个文本边界。- 参数:
-
newText- 要扫描的新文本。
-
getWordInstance
返回默认区域设置下的单词边界的新BreakIterator实例。- 返回:
- 单词边界的断句器
-
getWordInstance
返回给定区域设置下的单词边界的新BreakIterator实例。- 参数:
-
locale- 所需的区域设置 - 返回:
- 单词边界的断句器
- 抛出:
-
NullPointerException- 如果locale为null
-
getLineInstance
返回默认区域设置下的行边界的新BreakIterator实例。- 返回:
- 行边界的断句器
-
getLineInstance
返回给定区域设置下的行边界的新BreakIterator实例。- 参数:
-
locale- 所需的区域设置 - 返回:
- 行边界的断句器
- 抛出:
-
NullPointerException- 如果locale为null
-
getCharacterInstance
返回默认区域设置下的字符边界的新BreakIterator实例。- 返回:
- 字符边界的断句器
-
getCharacterInstance
返回给定区域设置下的字符边界的新BreakIterator实例。- 参数:
-
locale- 所需的区域设置 - 返回:
- 字符边界的断句器
- 抛出:
-
NullPointerException- 如果locale为null
-
getSentenceInstance
返回默认区域设置下的句子边界的新BreakIterator实例。- 返回:
- 句子边界的断句器
-
getSentenceInstance
返回给定区域设置下的句子边界的新BreakIterator实例。- 参数:
-
locale- 所需的区域设置 - 返回:
- 句子边界的断句器
- 抛出:
-
NullPointerException- 如果locale为null
-
getAvailableLocales
返回此类的get*Instance方法可以返回本地化实例的所有区域设置的数组。返回的数组表示Java运行时支持的区域设置和已安装的BreakIteratorProvider实现的联合。至少,返回的数组必须包含一个等于Locale.ROOT的Locale实例和一个等于Locale.US的Locale实例。- 返回:
-
可用于本地化
BreakIterator实例的区域设置数组。
-