## Límite de Palabra

Se invoca al método getWordIterator para ejemplarizar un BreakIterator que detecte límites de palabra:

    BreakIterator wordIterator =
       BreakIterator.getWordInstance(currentLocale);

Querremos crear un BreakIterator como éste cuando nuestras aplicaciones necesiten realizar operaciones con palabras individuales. Estas operaciones podrían ser las funciones comunes de los procesadores de textos como selecionar, cortar, pegar y copiar. O nuestras aplicaciones podrían buscar palabras, y para hacer esto necesitan poder distinguir entre palabras completas.

Cuando se realizan análisis de límites de palabra, un BreakIterator diferencia entre las palabras y los caracteres que no forman parte de las palabras. Estos caracteres, que incluyen espacios, tabuladores, marcas de puntuación, y algunos símbolos, tienen límites de palabras en ámbos lados.

En el siguiente ejemplo, extraido del programa BreakIteratorDemo.java, queremos marcar los límites de palabras en algún texto. Primero creamos el BreakIterator y luego llamamos a un método que hemos escrito llamado markBoundaries:

    Locale currentLocale = new Locale ("en","US");

    BreakIterator wordIterator =
       BreakIterator.getWordInstance(currentLocale);

    String someText = "She stopped.  " +
                      "She said, \"Hello there,\" and then went on.";

    markBoundaries(someText, wordIterator);

El propósito de este método es marcar los límites de palabras en un string con un caracter ('^'). Cada vez que BreakIterator detecta un límite palabra, insertamos este caracter en el buffer markers. Scaneamos el string en un bucle, llamando al método next hasta que devuelva BreakIterator.DONE. Aquí tenemos el código de la rutina markBoundaries:

    static void markBoundaries(String target, BreakIterator iterator) {

       StringBuffer markers = new StringBuffer();
       markers.setLength(target.length() + 1);
       for (int k = 0; k < markers.length(); k++) {
          markers.setCharAt(k,' ');
       }

       iterator.setText(target);
       int boundary = iterator.first();

       while (boundary != BreakIterator.DONE) {
          markers.setCharAt(boundary,'^');
          boundary = iterator.next();
       }

       System.out.println(target);
       System.out.println(markers);
    }

El método markBoundaries imprime el string target y el buffer markers. Obseva donde ocurren los caracteres ('^') en relación con las marcas de puntuación y los espacios:

    She stopped.  She said, "Hello there," and then went on.
    ^  ^^      ^^ ^  ^^   ^^^^    ^^    ^^^^  ^^   ^^   ^^  ^

El BreakIterator hace sencilla la selección de palabras dentro de un texto. No tenemos que escribir nuestras propias rutinas para manejar las reglas de puntuación de los distintos idiomas, porque la clase BreakIterator lo hace por nosotros. Aquí podemos ver una subrutina que extrae e imprime las palabras de una cadena dada:

    static void extractWords(String target, BreakIterator wordIterator) {

       wordIterator.setText(target);
       int start = wordIterator.first();
       int end = wordIterator.next();

       while (end != BreakIterator.DONE) {
          String word = target.substring(start,end);
          if (Character.isLetterOrDigit(word.charAt(0))) {
             System.out.println(word);
          }
          start = end;
          end = wordIterator.next();
       }
    }

En nuestro ejemplo, llamamos a extractWords, le pasamos la misma cadena que en el ejemplo anterior. El método extractWords imprimirá la siguiente lista de palabras:

    She
    stopped
    She
    said
    Hello
    there
    and
    then
    went
    on.

Ozito