En la documentación de Oracle Pattern hay una descripción de tres patrones diferentes para hacer coincidir el espacio en blanco:
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.
\p{javaWhitespace}
incluye FILE SEPARATOR
, GROUP SEPARATOR
, etc … ver esto . Usarlo cuando no se necesitan puede confundir a otra persona. \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.
\v
\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
\v
de Perl 5.18 como experimento. \u0085
\u180e
.NET (predeterminado): además de 5 comunes
\v
\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