Pregunta

Actualmente estoy tratando de filtrar un archivo de texto que contiene palabras separadas con un "-". Quiero contar las palabras.

scanner.useDelimiter(("[.,:;()?!\" \t\n\r]+"));

El problema que se produce simplemente es: las palabras que contienen un "-" se separarse y contados por ser dos palabras. Por lo que sólo escapar con \ -. No es la solución preferida

¿Cómo puedo cambiar el delimitador de expresión, por lo que palabras como "foo-bar" permanecerán, pero el "-" solo será filtrado y se ignoran

?

Gracias;)

¿Fue útil?

Solución

OK, supongo que en su pregunta aquí: ¿Quiere decir que usted tiene un archivo de texto con un poco de prosa "real", es decir, frases que realmente tienen sentido, están separados por puntuacion y similares, etc., a la derecha

Ejemplo:

  

Esta situación se mejora - por lo que podemos decir - por el hecho de que nuestros aliados más confiables, el Vorgons, continúan manteniendo sus concursos de poesía; el enemigo tiene pocos incentivos para interferir con eso, incluso con sus dispositivos-O-Matic de silencio.

Por lo tanto, lo que tiene como delimitador es algo que es o bien cualquier cantidad de espacios en blanco y / o puntuacion (que ya ha cubierto con la expresión regular que mostró), o un guión que está rodeado por al menos un espacio en blanco a cada lado . El carácter de expresiones regulares a favor "o" es "|". Hay un acceso directo para la clase de caracteres de espacio en blanco (espacios, tabulaciones y saltos de línea) en muchas implementaciones de expresiones regulares:. "\ S"

"[.,:;()?!\"\s]+|\s+-\s+"

Otros consejos

Si es posible tratar de utilizar las clases predefinidas ... hace que la expresión regular mucho más fácil de leer. Ver java.util.regex.Pattern para las opciones.

Tal vez esto es lo que busca:

string.split("\\s+(\\W*\\s)?"

lee:. Match 1 o caracteres de espacio en blanco más opcionalmente seguido de cero o más caracteres no palabra y un carácter de espacio en blanco

Esto no es muy simple. Una cosa a tratar sería {corriente delimeter-chars} {-o-más-guiones cero} {cero-o-más-corriente-delimeter-chars-o-guión}.

Puede ser que sea más fácil simplemente ignorar las palabras devueltas por el escáner que consisten enteramente de guiones

Scanner scanner = new Scanner("one   two2  -   (three) four-five - ,....|");
scanner.useDelimiter("(\\B+-\\B+|[.,:;()?!\" \t|])+");

while (scanner.hasNext()) {
    System.out.println(scanner.next("\\w+(-\\w+)*"));
}

Nota:

el método siguiente (String) afirma que se obtiene sólo palabras ya que el useDelimiter originales (método) no ve "|"

Nota:

que haya utilizado la expresión regular "\ r \ n | \ n" como terminador de línea. Los JavaDocs para java.util.regex.Pattern muestra otros terminadores de línea posibles, por lo que una comprobación más completa sería utilizar la expresión "\ r \ n | [\ r \ n \ u2028 \ u2029 \ u0085]"

Esto debería ser una bastante simple: [^\\w-]\\W*|-\\W+

  • Pero, por supuesto, si se trata de prosa, y que desea excluir subraya :
    [^\\p{Alnum}-]\\P{Alnum}*|-\\P{Alnum}+
  • o si no esperas numéricos:
    [^\\p{Alpha}-]\\P{Alpha}*|-\\P{Alpha}+

EDIT: Estas son las formas más fáciles. Tenga en cuenta la solución completa, que se ocuparía de guiones al principio y al final de las líneas que siguen este patrón. (?:^|[^\\w-])\\W*|-(?:\\W+|$)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top