java.lang.Object java.text.BreakIterator
BreakIterator
类实现用于查找文本中边界位置的方法。BreakIterator
的实例维护一个当前位置并扫描文本,同时返回边界出现处的字符索引。在内部,BreakIterator
使用 CharacterIterator
扫描文本,因此能扫描实现该协议的任何对象所保存的文本。StringCharacterIterator
用于扫描传递给 setText
的 String
对象。
可以用此类提供的工厂方法创建不同类型的分解迭代器实例。具体来说,可以使用 getWordIterator
、getLineIterator
、getSentenceIterator
和 getCharacterIterator
分别创建执行单词、行、句子和字符边界分析的 BreakIterator
。一个 BreakIterator
只能在一个单元(单词、行、句子等)上工作。对于希望执行的每个单元边界分析,必须使用不同的迭代器。
行边界分析决定了文本字符串换行时如何分解。这种机制能正确处理标点符号和带连字符的单词。实际的行分解还需要考虑可用的行宽,是通过较高级别的软件处理的。
句子边界分析使选中内容能正确解释数字和缩写中的句点,以及结尾的标点符号,如引号和圆括号。
单词边界分析用于搜索和替换功能,以及允许用户使用鼠标双击选择单词的文本编辑应用程序。单词选择能正确地解释单词内及单词后的标点符号。符号或者标点符号之类不属于单词的字符在其两端都会分解。
字符边界分析允许用户以期望的方式与字符交互,比如,将光标移过一个文本字符串。字符边界分析提供通过字符串的正确导航,而无需考虑字符如何存储。返回的边界可能是增补字符的边界,由字符序列或连字集群组成。例如,一个强调字符可能存储为一个基本字符和一个可区别的标记。被用户视为字符的内容随语言不同而不同。
由此类的工厂方法返回的 BreakIterator
实例只用于自然语言,不用于编程语言文本。不过,可以定义标记某种编程语言的子类。
示例:
创建并使用文本边界:
按顺序打印每个元素:public static void main(String args[]) { if (args.length == 1) { String stringToExamine = args[0]; //print each word in order BreakIterator boundary = BreakIterator.getWordInstance(); boundary.setText(stringToExamine); printEachForward(boundary, stringToExamine); //print each sentence in reverse order 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)); }
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; }(BreakIterator.getWordInstance() 返回的迭代器是唯一的,因为它所返回的分解位置不表示迭代内容的开始和结束。也就是说,一个句子分解迭代器返回的每一个分解表示一个句子的结束和下一个句子的开始。使用单词分解迭代器,两个边界之间的字符可能是一个单词,也可能是两个单词之间的标点符号或空格。以上代码使用一个简单的示例来确定哪一个边界是单词的开始:如果此边界和下一边界之间的字符至少包含了一个字母(可以是字母表中的字母、中日韩 (CJK) 表意字符、韩文音节、日语假名字符等等),那么此边界和下一边界之间的文本就是一个单词;否则,它就是单词之间的内容。)
CharacterIterator
字段摘要 | |
---|---|
static int |
DONE 在已经到达第一个或最后一个文本边界时,previous()、next()、next(int)、preceding(int) 和 following(int) 将返回 DONE。 |
构造方法摘要 | |
---|---|
protected |
BreakIterator() 构造方法。 |
方法摘要 | |
---|---|
Object |
clone() 创建此迭代器的副本。 |
abstract int |
current() 返回最近由 next()、next(int)、previous()、first()、last()、following(int) 或 preceding(int) 返回的文本边界的字符索引。 |
abstract int |
first() 返回第一个边界。 |
abstract int |
following(int offset) 返回指定字符偏移量后面的第一个边界。 |
static Locale[] |
getAvailableLocales() 返回一个数组,它由此类的 getInstance 方法可为之返回本地化实例的所有语言环境组成。 |
static BreakIterator |
getCharacterInstance() 返回一个用于默认语言环境字符分解的新 BreakIterator 实例。 |
static BreakIterator |
getCharacterInstance(Locale locale) 返回一个用于给定语言环境字符分解的新 BreakIterator 实例。 |
static BreakIterator |
getLineInstance() 返回一个用于默认语言环境行分解的新 BreakIterator 实例。 |
static BreakIterator |
getLineInstance(Locale locale) 返回一个用于给定语言环境行分解的新 BreakIterator 实例。 |
static BreakIterator |
getSentenceInstance() 返回一个用于默认语言环境句子分解的新 BreakIterator 实例。 |
static BreakIterator |
getSentenceInstance(Locale locale) 返回一个用于给定语言环境句子分解的新 BreakIterator 实例。 |
abstract CharacterIterator |
getText() 获取被扫描的文本 |
static BreakIterator |
getWordInstance() 返回一个用于默认语言环境单词分解的新 BreakIterator 实例。 |
static BreakIterator |
getWordInstance(Locale locale) 返回一个用于给定语言环境单词分解的新 BreakIterator 实例。 |
boolean |
isBoundary(int offset) 如果指定字符偏移量是一个文本边界,则返回 true。 |
abstract int |
last() 返回最后一个边界。 |
abstract int |
next() 返回当前边界的后一个边界。 |
abstract int |
next(int n) 返回从当前边界起第 n 个边界。 |
int |
preceding(int offset) 返回指定字符偏移量前面的最后一个边界。 |
abstract int |
previous() 返回当前边界的前一个边界。 |
abstract void |
setText(CharacterIterator newText) 设置一个新文本用于扫描。 |
void |
setText(String newText) 设置要被扫描的新文本字符串。 |
从类 java.lang.Object 继承的方法 |
---|
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
字段详细信息 |
---|
public static final int DONE
构造方法详细信息 |
---|
protected BreakIterator()
方法详细信息 |
---|
public Object clone()
public abstract int first()
public abstract int last()
public abstract int next(int n)
BreakIterator.DONE
,当前位置被设置为第一个文本边界或最后一个文本边界,具体取决于所到达的边界。否则,迭代器的当前位置被设置为新边界。例如,如果迭代器的当前位置是第 m 个文本边界,并且从当前文本边界到最后一个文本边界之间还有三个边界,则 next(2) 调用将返回 m + 2。新文本位置被设置为第 (m + 2) 个文本边界。next(4) 调用将返回
BreakIterator.DONE
,而最后一个文本边界将成为新的文本位置。
n
- 要返回的边界。0 值表示不执行任何操作。负值移向前面的边界,正值移向后面的边界。
BreakIterator.DONE
。
public abstract int next()
BreakIterator.DONE
,迭代器的当前位置不变。否则,迭代器的当前位置被设置为当前边界的后一个边界。
BreakIterator.DONE
。等效于 next(1)。
next(int)
public abstract int previous()
BreakIterator.DONE
,迭代器的当前位置不变。否则,迭代器的当前位置被设置为当前边界的前一个边界。
BreakIterator.DONE
。
public abstract int following(int offset)
BreakIterator.DONE
,迭代器的当前位置不变。否则,迭代器的当前位置被设置为返回的边界。返回的值总是大于 offset,或者为值
BreakIterator.DONE
。
offset
- 开始进行扫描的字符偏移量。
BreakIterator.DONE
。
IllegalArgumentException
- 如果指定偏移量小于第一个文本边界或者大于最后一个文本边界。
public int preceding(int offset)
BreakIterator.DONE
,迭代器的当前位置不变。否则,迭代器的当前位置被设置为返回的边界。返回的值总是小于 offset,或者为值
BreakIterator.DONE
。
offset
- 开始进行扫描的字符偏移量。
BreakIterator.DONE
。
IllegalArgumentException
- 如果指定偏移量小于第一个文本边界或者大于最后一个文本边界。
public boolean isBoundary(int offset)
offset
- 要检查的字符偏移量。
true
;否则返回
false
。
public abstract int current()
BreakIterator.DONE
,则返回第一个或最后一个文本边界,具体取决于到达的是哪一个边界。
next()
,
next(int)
,
previous()
,
first()
,
last()
,
following(int)
,
preceding(int)
public abstract CharacterIterator getText()
public void setText(String newText)
newText
- 要扫描的新文本。
public abstract void setText(CharacterIterator newText)
newText
- 要扫描的新文本。
public static BreakIterator getWordInstance()
public static BreakIterator getWordInstance(Locale locale)
BreakIterator
实例。
locale
- 所需的语言环境
NullPointerException
- 如果
locale
为 null
public static BreakIterator getLineInstance()
public static BreakIterator getLineInstance(Locale locale)
BreakIterator
实例。
locale
- 所需的语言环境
NullPointerException
- 如果
locale
为 null
public static BreakIterator getCharacterInstance()
public static BreakIterator getCharacterInstance(Locale locale)
BreakIterator
实例。
locale
- 所需的语言环境
NullPointerException
- 如果
locale
为 null
public static BreakIterator getSentenceInstance()
public static BreakIterator getSentenceInstance(Locale locale)
BreakIterator
实例。
locale
- 所需的语言环境
NullPointerException
- 如果
locale
为 null
public static Locale[] getAvailableLocales()
getInstance
方法可为之返回本地化实例的所有语言环境组成。返回的数组表示 Java 运行时所支持的语言环境和已安装的
BreakIteratorProvider
实现所支持的语言环境的并集。该数组至少必须包含一个等于
Locale.US
的
Locale
实例。
BreakIterator
实例。