模块 java.base
 java.text

类 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 Consortium 的 Extended Grapheme Cluster breaks。有关详细信息,请参阅 Unicode 标准附件 #29 中的字素簇边界部分。

此类的工厂方法返回的 BreakIterator 实例仅供自然语言使用,不适用于编程语言文本。然而,可以定义标记编程语言的子类。

Examples :

创建和使用文本边界:

 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() 返回的迭代器是独一无二的,因为它返回的中断位置并不代表被迭代的事物的开始和结束。也就是说,一个句子中断迭代器返回中断,每个中断代表一个句子的结尾和下一个句子的开头。使用分词迭代器,两个边界之间的字符可能是一个单词,或者它们可能是两个单词之间的标点符号或空格。上面的代码使用一个简单的启发式来确定哪个boundary 是单词的开头:如果这个边界和下一个边界之间的字符至少包含一个字母(这可以是字母、CJK 表意文字、韩文音节、假名字符等),那么文本这个边界和下一个边界之间是一个词;否则,它是词之间的材料。)
自从:
1.1
参见:
  • 字段详细信息

    • DONE

      public static final int DONE
      当到达第一个或最后一个文本边界时, previous()、next()、next(int)、preceding(int) 和 following(int) 返回 DONE。
      参见:
  • 构造方法详细信息

    • BreakIterator

      protected BreakIterator()
      构造方法。 BreakIterator 是无状态的,没有默认行为。
  • 方法详情

    • 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)th 文本边界。 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
    • isBoundary

      public boolean isBoundary(int offset)
      如果指定的字符偏移量是文本边界,则返回 true。
      参数:
      offset - 要检查的字符偏移量。
      返回:
      true 如果“偏移量”是边界位置,false 否则。
      抛出:
      IllegalArgumentException - 如果指定的偏移量小于第一个文本边界或大于最后一个文本边界。
      自从:
      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)
      设置要扫描的新文本字符串。当前扫描位置重置为 first()。
      参数:
      newText - 要扫描的新文本。
    • setText

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

      public static BreakIterator  getWordInstance()
      默认locale 返回 断字 的新 BreakIterator 实例。
      返回:
      一个用于断字的迭代器
    • getWordInstance

      public static BreakIterator  getWordInstance(Locale  locale)
      为给定locale的 断字 返回一个新的 BreakIterator 实例。
      参数:
      locale - 所需的locale
      返回:
      一个用于断字的迭代器
      抛出:
      NullPointerException - 如果 locale 为空
    • getLineInstance

      public static BreakIterator  getLineInstance()
      默认locale 返回 换行符 的新 BreakIterator 实例。
      返回:
      换行符的中断迭代器
    • getLineInstance

      public static BreakIterator  getLineInstance(Locale  locale)
      为给定locale的 换行符 返回一个新的 BreakIterator 实例。
      参数:
      locale - 所需的locale
      返回:
      换行符的中断迭代器
      抛出:
      NullPointerException - 如果 locale 为空
    • getCharacterInstance

      public static BreakIterator  getCharacterInstance()
      默认locale 返回 字符中断 的新 BreakIterator 实例。
      返回:
      字符中断的中断迭代器
    • getCharacterInstance

      public static BreakIterator  getCharacterInstance(Locale  locale)
      为给定locale的 字符中断 返回一个新的 BreakIterator 实例。
      参数:
      locale - 所需的locale
      返回:
      字符中断的中断迭代器
      抛出:
      NullPointerException - 如果 locale 为空
    • getSentenceInstance

      public static BreakIterator  getSentenceInstance()
      默认locale 返回 断句 的新 BreakIterator 实例。
      返回:
      用于句子中断的中断迭代器
    • getSentenceInstance

      public static BreakIterator  getSentenceInstance(Locale  locale)
      为给定locale的 断句 返回一个新的 BreakIterator 实例。
      参数:
      locale - 所需的locale
      返回:
      用于句子中断的中断迭代器
      抛出:
      NullPointerException - 如果 locale 为空
    • getAvailableLocales

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