Module java.base
Package java.text

Class BreakIterator

java.lang.Object
java.text.BreakIterator
所有已实现的接口:
Cloneable

public abstract class BreakIterator extends Object implements Cloneable
BreakIterator类实现了用于查找文本边界位置的方法。 BreakIterator的实例保持当前位置并扫描文本,返回边界出现的字符索引。在内部,BreakIterator使用CharacterIterator扫描文本,因此能够扫描由实现该协议的任何对象持有的文本。使用StringCharacterIterator来扫描传递给setTextString对象。

您可以使用此类提供的工厂方法来创建各种类型的断句器实例。特别地,使用getWordInstancegetLineInstancegetSentenceInstancegetCharacterInstance来分别创建执行单词、行、句子和字符边界分析的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));
}
查找下一个单词:
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表意文字、Hangul音节、Kana字符等),则此边界和下一个之间的文本是一个单词;否则,它是两个单词之间的内容。)
自版本:
1.1
参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    当到达第一个或最后一个文本边界时,previous()、next()、next(int)、preceding(int)和following(int)会返回DONE。
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    构造函数。
  • Method Summary

    Modifier and Type
    Method
    Description
    clone()
    创建此迭代器的副本
    abstract int
    返回最近由next()、next(int)、previous()、first()、last()、following(int)或preceding(int)返回的文本边界的字符索引。
    abstract int
    first()
    返回第一个边界。
    abstract int
    following(int offset)
    返回指定字符偏移量后的第一个边界。
    static Locale[]
    返回此类的get*Instance方法可以返回本地化实例的所有区域设置的数组。
    static BreakIterator
    返回默认区域设置的字符断点的新BreakIterator实例。
    static BreakIterator
    返回给定区域设置的字符断点的新BreakIterator实例。
    static BreakIterator
    返回默认区域设置的行断点的新BreakIterator实例。
    static BreakIterator
    返回给定区域设置的行断点的新BreakIterator实例。
    static BreakIterator
    返回默认区域设置的句子断点的新BreakIterator实例。
    static BreakIterator
    返回给定区域设置的句子断点的新BreakIterator实例。
    获取正在扫描的文本
    static BreakIterator
    返回默认区域设置的单词断点的新BreakIterator实例。
    static BreakIterator
    返回给定区域设置的单词断点的新BreakIterator实例。
    boolean
    isBoundary(int offset)
    如果指定的字符偏移量是文本边界,则返回true。
    abstract int
    last()
    返回最后一个边界。
    abstract int
    next()
    返回当前边界之后的边界。
    abstract int
    next(int n)
    返回当前边界之后的第n个边界。
    int
    preceding(int offset)
    返回指定字符偏移之前的最后一个边界。
    abstract int
    返回当前边界之前的边界。
    void
    setText(String newText)
    设置要扫描的新文本字符串。
    abstract void
    设置要扫描的新文本。

    Methods declared in class java.lang.Object

    equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 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

      public Object clone()
      创建此迭代器的副本。
      覆盖:
      clone 在类 Object
      返回:
      此对象的副本
      参见:
    • 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

      public abstract CharacterIterator getText()
      获取正在扫描的文本
      返回:
      正在扫描的文本
    • setText

      public void setText(String newText)
      设置要扫描的新文本字符串。当前扫描位置重置为第一个文本边界。
      参数:
      newText - 要扫描的新文本。
    • setText

      public abstract void setText(CharacterIterator newText)
      设置要扫描的新文本。当前扫描位置重置为第一个文本边界。
      参数:
      newText - 要扫描的新文本。
    • getWordInstance

      public static BreakIterator getWordInstance()
      返回默认区域设置下的单词边界的新BreakIterator实例。
      返回:
      单词边界的断句器
    • getWordInstance

      public static BreakIterator getWordInstance(Locale locale)
      返回给定区域设置下的单词边界的新BreakIterator实例。
      参数:
      locale - 所需的区域设置
      返回:
      单词边界的断句器
      抛出:
      NullPointerException - 如果locale为null
    • getLineInstance

      public static BreakIterator getLineInstance()
      返回默认区域设置下的行边界的新BreakIterator实例。
      返回:
      行边界的断句器
    • getLineInstance

      public static BreakIterator getLineInstance(Locale locale)
      返回给定区域设置下的行边界的新BreakIterator实例。
      参数:
      locale - 所需的区域设置
      返回:
      行边界的断句器
      抛出:
      NullPointerException - 如果locale为null
    • getCharacterInstance

      public static BreakIterator getCharacterInstance()
      返回默认区域设置下的字符边界的新BreakIterator实例。
      返回:
      字符边界的断句器
    • getCharacterInstance

      public static BreakIterator getCharacterInstance(Locale locale)
      返回给定区域设置下的字符边界的新BreakIterator实例。
      参数:
      locale - 所需的区域设置
      返回:
      字符边界的断句器
      抛出:
      NullPointerException - 如果locale为null
    • getSentenceInstance

      public static BreakIterator getSentenceInstance()
      返回默认区域设置下的句子边界的新BreakIterator实例。
      返回:
      句子边界的断句器
    • getSentenceInstance

      public static BreakIterator getSentenceInstance(Locale locale)
      返回给定区域设置下的句子边界的新BreakIterator实例。
      参数:
      locale - 所需的区域设置
      返回:
      句子边界的断句器
      抛出:
      NullPointerException - 如果locale为null
    • getAvailableLocales

      public static Locale[] getAvailableLocales()
      返回此类的get*Instance方法可以返回本地化实例的所有区域设置的数组。返回的数组表示Java运行时支持的区域设置和已安装的BreakIteratorProvider实现的联合。至少,返回的数组必须包含一个等于Locale.ROOTLocale实例和一个等于Locale.USLocale实例。
      返回:
      可用于本地化BreakIterator实例的区域设置数组。