モジュール java.base
パッケージ java.text

クラスBreakIterator

java.lang.Object
java.text.BreakIterator
すべての実装されたインタフェース:
Cloneable

public abstract class BreakIterator extends Object implements Cloneable
BreakIteratorクラスは、テキスト内の境界の位置を見つけるメソッドを実装します。 BreakIteratorのインスタンスは現在の位置を維持し、テキストをスキャンして境界が発生する文字のインデックスを返します。 内部的には、BreakIteratorCharacterIteratorを使ってテキストをスキャンするため、このプロトコルを実装する任意のオブジェクトによって保持されるテキストをスキャンできます。 StringCharacterIteratorは、setTextに渡されたStringオブジェクトのスキャンに使用されます。

このクラスによって提供されるファクトリ・メソッドを使って、さまざまな型の分割イテレータのインスタンスを生成します。 特に、単語、行、文、および文字の境界解析を実行するBreakIteratorを生成するには、それぞれgetWordInstancegetLineInstancegetSentenceInstance、およびgetCharacterInstanceを使用します。 単一のBreakIteratorは、1つのユニット(単語、行、文など)のみを処理します。 実行するユニット境界解析ごとに異なるイテレータを使用する必要があります。

行の境界解析では、テキスト文字列を行折返しで分割する位置を判定します。 句読点およびハイフネーションされた単語も、メカニズムにより正しく処理されます。 実際の行分割は、使用可能な行幅も考慮する必要があるため、より高いレベルのソフトウェアによって処理されます。

文の境界解析では、数字と略語の中のピリオド、さらに引用符や括弧などの終了文字の正しい解釈について選択が可能です。

単語の境界解析は、検索置換機能で使用されます。また、テキスト編集アプリケーション内で、ダブルクリックによって単語が選択可能になります。 単語選択では、後続を含む単語内で句読点の正しい解釈が提供されます。 また、記号や句読点などのように単語の一部でない文字、前後に分割のある文字も正しく解釈されます。

文字の境界解析では、たとえばカーソルをテキスト文字列に沿って動かすような場合に、ユーザーが予測するとおりの操作が行われるようにします。 文字の境界解析により、文字の格納方法に依存せず、文字列の正しいナビゲーションが可能になります。 返される境界は、補助文字、結合文字シーケンス、または合字クラスタの境界になる場合があります。 たとえば、アクセント付きの文字は、基準文字と発音区別符号として格納されている場合があります。 ユーザーの文字に対する認識は言語間で異なります。

実装要件:
文字境界解析のデフォルトの実装は、Unicode ConsortiumのExtended Grapheme Clusterのブレークに準拠しています。 詳細については、Unicode Standard Annex #29の「Graphemeクラスタの境界」セクションを参照してください。

このクラスのファクトリ・メソッドから返される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()によって返されるイテレータは一意であるため、返される分割位置は反復の開始と終了の両方を表すものではない。 つまり、文を分割するイテレータは、それぞれが1つの文の終了と次の文の開始を表す分割を返す。 単語を分割するイテレータでは、2つの境界間の文字が単語、句読点、または2つの単語間の空白文字の場合がある。 上記のコードでは、単純なヒューリスティックを使用して、単語の開始の境界を判定している。ある境界と次の境界の間の文字が、少なくとも1つの文字(アルファベット、CJK統合漢字、ハングル文字、仮名など)を含む場合は、この境界と次の境界の間のテキストを単語とし、そうでない場合は、単語間のデータと見なす)。

導入されたバージョン:
1.1
関連項目:
  • フィールド詳細

    • DONE

      public static final int DONE
      DONEは、最初または最後のテキスト境界に到達したときに、previous()、next()、next(int)、preceding(int)、およびfollowing(int)によって返されます。
      関連項目:
  • コンストラクタの詳細

    • 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番目のテキスト境界にあり、現在の境界から最後のテキスト境界まで3つの境界が存在している場合、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
    • 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()
      デフォルト・ロケール単語分割用の新しい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.ROOTに等しいLocaleインスタンスと、Locale.USに等しいLocaleインスタンスが含まれている必要があります。
      戻り値:
      ローカライズされたBreakIteratorインスタンスを使用可能なロケールの配列。