¿Cómo elegir entre el patrón de espacios en blanco?

En la documentación de Oracle Pattern hay una descripción de tres patrones diferentes para hacer coincidir el espacio en blanco:

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

Me pregunto cuál es la especificidad de cada uno y cómo saber cómo elegir el correcto. Me acabo de dar cuenta de que \p{javaWhitespace} incluye más tipo de espacio.

Prefiero usar el primero.

  • Es compacto
  • Es la misma notación en muchos otros idiomas, así como en la teoría de la expresión regular
  • \p{javaWhitespace} incluye FILE SEPARATOR , GROUP SEPARATOR , etc … ver esto . Usarlo cuando no se necesitan puede confundir a otra persona.
  • En general, esperaría que otro progtwigdor supiera qué es, mientras que esperaría que comprobara dos \p{javaWhitespace} 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.

\s es la opción más corta y también la 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 syntax de un motor regex a otro. Hay muchos motores de expresiones regulares que usan la syntax similar a Perl, por lo que la diferencia de interpretación para la misma syntax como \s confunde a los progtwigdores.

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

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

  • JavaScript (Edición 5.1): según las especificaciones (palabra por palabra), además de los 5 comunes, incluye:

    • Categoría Unicode Zs (Separator / Space) , \u2028 (Line Separator), \u2029 (Paragraph Separator). 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-Order Mark aka ZERO WIDTH NO-BREAK SPACE \ufeff
  • Perl , PCRE (modo ASCII): se agregó la pestaña vertical \v de Perl 5.18 como experimento. Antes de 5.18, solo coincide con los 5 comunes.

  • Perl (modo Unicode): además de los 5 comunes

    • Unicode categoría Z (Separador)
    • Se agregó una pestaña vertical \v de Perl 5.18 como experimento.
    • SIGUIENTE LÍNEA (NEL) \u0085
    • SEPARADOR DE LA \u180e
  • .NET (predeterminado): además de 5 comunes

    • Unicode categoría Z (Separador)
    • Pestaña vertical \v
    • SIGUIENTE LÍNEA (NEL) \u0085
  • Java (Unicode): a partir de Java 7, la clase Pattern incluye un nuevo indicador UNICODE_CHARACTER_CLASS que hace que las clases de caracteres predefinidos y las clases de caracteres POSIX se ajusten al estándar técnico n.º 18 de Unicode: Expresión regular Unicode . Cuando el indicador está activo, la clase de caracteres predefinidos y la clase de caracteres POSIX correspondiente serán equivalentes (coinciden con lo mismo).

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

¡Eso es suficiente para volver loco a uno!


\p{Space} es la opción más “estable” ya que sigue el estándar POSIX en modo predeterminado y el Estándar técnico # 18 de Unicode: Expresión regular Unicode en UNICODE_CHARACTER_CLASS .

Si utiliza la clase de caracteres POSIX, la implementación conforme a POSIX tendrá el mismo comportamiento en modo ASCII, y los motores de expresiones regulares Unicode que sigan la recomendación tendrán el ( casi ) mismo comportamiento en modo Unicode.

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


\p{isJavaWhitespace} para \p{isJavaWhitespace} espacios en blanco de acuerdo con la definición de Java . El nombre de la función es extremadamente engañoso.

A menos que tenga un motivo específico para usar las otras opciones, lo mantendría simple y \s