2012-02-15 24 views
5

En el Oracle Pattern documentation existe la descripción de tres patrones diferentes para los espacios en blanco a juego:¿Cómo elegir entre el patrón de espacios en blanco?

  1. \ s
  2. \ {p} Espacio
  3. \ {p} javaWhitespace

estoy preguntándose cuál es la especificidad de cada uno y cómo saber cómo elegir el correcto. Acabo de notar que \p{javaWhitespace} incluyen más tipo de espacio.

+0

Eso depende de lo que sea más claro para usted y para qué lo necesita. ¿Lo necesita para tratar "más tipo de espacio" como espacio o no? –

+0

Sí, quiero usarlo para delimitar palabras en una oración. –

Respuesta

4

Prefiero usar el primero.

  • Es compacto
  • Es la misma notación que en muchos otros idiomas, así como en la teoría de la expresión regular
  • \p{javaWhitespace} incluyen FILE SEPARATOR, GROUP SEPARATOR, etc ... ver this. Usarlo cuando no se necesitan puede confundir a otra persona.
  • En general, esperaría que otro programador supiera qué es \s, mientras que esperaré que comprueben cuál es la definición exacta de \p{javaWhitespace}. No desea eso, ya que disminuye la claridad del código y agrega una carga innecesaria durante la depuración.
+0

Ok gracias! El uso de '\ p {javaWhitespace}' es transparente para el desarrollador en mi situación porque estoy usando 'java.util.Scanner', para iterar sobre palabras en una Cadena, y es el delimitador predeterminado. Así que me preguntaba si debería cambiar con '.useDelimiter (" \\ s + ")' –

0

menos que tenga una razón concreta para usar las otras opciones, me gustaría que sea sencillo y utilizar \s

+0

So '\ s' es simplemente una forma más simple de escribir' \ p {Space} '? –

3

\s es la más corta y también la opción más no portátil para especificar un carácter de espacio . Aunque es raro transferir el código Java a otros lenguajes, se trata más de transferir el conocimiento de la sintaxis de un motor regex a otro. Hay muchos motores de expresiones regulares que usan la sintaxis similar a Perl, por lo que la diferencia de interpretación para la misma sintaxis como \s confunde a los programadores.

Aparte de espacio (ASCII 32), la nueva línea (\n, ASCII 10), pestaña horizontal (\t, ASCII 9), retorno de carro (\r, ASCII 13) y alimentación de forma (\f, ASCII 12), hay no hay consenso entre los diferentes motores de lo que es un carácter de espacio.

  • Java, POSIX (ASCII): También incluye pestaña vertical (ASCII 11). Java parece seguir el estándar POSIX aquí.

  • JavaScript (Edición 5.1): De acuerdo con las especificaciones (palabra por palabra), aparte de los 5 más comunes, que incluye:

    • categoría Unicode Zs (Separator/Space), \u2028 (línea de separación), \u2029 (Separador de párrafos). Básicamente incluye todos los personajes de la categoría Z (Separador).

      En realidad \u2028 es el único miembro de la categoría Zl (Separator/Line) y \u2029 es el único miembro de la categoría Zp (Separator/Paragraph).Por la redacción, es posible que la versión actual de las especificaciones excluya cualquier extensión adicional a esas 2 categorías.

    • pestaña Vertical \v
    • Byte-marca de orden de alias CERO ANCHO NO-BREAK SPACE\ufeff
  • Perl, PCRE (modo ASCII): pestaña Vertical \v añadida por Perl 5.18 como experimento. Antes de 5.18, solo coincide con los 5 comunes.

  • Perl (modo Unicode): Aparte de las 5 de las más comunes

    • Unicode categoría Z (separador)
    • pestaña Vertical \v añadió de Perl 5.18 como experimento.
    • siguiente línea (NEL) \u0085
    • Separador de vocal mongol\u180e
  • .NET (por defecto): Aparte de 5 de las más comunes

    • Unicode categoría Z (separador)
    • Pestaña vertical \v
    • siguiente línea (NEL) \u0085
  • Java (Unicode): A partir de Java 7, clase patrón incluye una nueva bandera UNICODE_CHARACTER_CLASS que hace clases de personajes predefinidos y clases de caracteres POSIX se ajusten a Unicode Technical Standard #18: Unicode Regular Expression. Cuando el indicador está activo, clase de caracteres predefinidos y la correspondiente clase de caracteres POSIX serán equivalentes (coinciden con lo mismo).

    La lista de caracteres es la misma que la de .NET.

¡Eso es suficiente para volver loco!


\p{Space} es la opción más "estable", ya que sigue la POSIX standard en el modo por defecto, y Unicode Technical Standard #18: Unicode Regular Expression en UNICODE_CHARACTER_CLASS.

Si utiliza la clase de caracteres POSIX, la aplicación compatible con POSIX tendrá el mismo comportamiento en modo ASCII, y los motores de expresiones regulares Unicode que siguen la recomendación tendrán la ( casi) el mismo comportamiento en modo Unicode.

\s y \p{Space} son equivalentes en Java, independientemente de la marca. Si usa \s en Java, puede estar seguro de que está siguiendo alguna norma/recomendación. Solo que no anuncia a la mayoría de los programadores sobre este hecho.


\p{isJavaWhitespace} para que coincida con los espacios en blanco de acuerdo con Java's definition. El nombre de la función es extremadamente engañoso.

+0

Esta respuesta se ha agregado a [Preguntas frecuentes sobre la expresión regular de desbordamiento de pila] (http://stackoverflow.com/a/22944075/2736496) , en "Clases de caracteres". – aliteralmind

Cuestiones relacionadas