2012-09-05 6 views
7

Lógicamente, es (pero la lógica es irrelevante cuando las codificaciones de caracteres o las configuraciones regionales están en juego). De acuerdo con¿Es " n" un espacio en blanco vertical, es decir, debería " v" coincidir?

perl -e 'print "\n" =~ /\v/ ? "y\n" : "n\n";' 

impresión "y", lo es. De acuerdo con

Pattern.compile("\\v").matcher("\n").matches(); 

regresar false en Java, no lo es. Esto no me confunda en absoluto, si no hubiera this posting alegando que

clase Patrón actualizada de Sun para JDK7 tiene una nueva bandera maravillosa, UNICODE_CHARACTER_CLASS, lo que hace que todo funcione bien de nuevo.

Pero estoy usando la versión de Java "1.7.0_07" y la bandera existe y parece no cambiar nada en absoluto. Además, "\ n" no es un recién llegado a Unicode, sino un viejo carácter ASCII, así que realmente no veo cómo puede suceder esta diferencia. Probablemente estoy haciendo algo estúpido, pero no puedo verlo.

+2

Por lo que puedo decir, Unicode no tiene una propiedad vertical en blanco. Es puramente una construcción de Perl que coincide con los siguientes caracteres: U + 000A, U + 000B, U + 000C, U + 000D, U + 0085, U + 2028 y U + 2029.Solo usa una clase de personaje que coincida con esos personajes. – ikegami

+0

@ikegami: Gracioso. Acabo de encontrar [esta lista] (http://unicode.org/Public/UNIDATA/PropList.txt) acordando con usted. – maaartinus

+0

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

Respuesta

17

The Javadoc for java.util.regex.Pattern menciona explícitamente \v en su "lista de construcciones Perl no admitidas por esta clase". Por lo tanto, no es que \n no pertenezca a la categoría de Java de "espacio en blanco vertical"; es que Java no tiene tiene una categoría de "espacio en blanco vertical".

Editado para añadir: En cambio, \v representa el carácter de tabulación vertical, U+000B. Esta es una secuencia de escape tradicional; también hay algunas otras secuencias de escape tradicionales que no están permitidas en los literales de cadena de Java pero que son compatibles con Pattern (\a para alerta/campana, \cX para el carácter de control X). Curiosamente, sin embargo, el Javadoc para Pattern no menciona que es compatible con \v; así que no estoy seguro de si se puede esperar que sea compatible con todas las implementaciones de JDK.

+0

Eso es cierto y algo que debería haber visto yo mismo. Sin embargo, a diferencia de muchos otros constructos no definidos como, por ejemplo, 'Pattern.compile (" \\ C ")' no arroja 'PatternSyntaxException'. En el código fuente finalmente encontré que coincide 'U + 000B', es decir," pestaña vertical "solamente. Sonidos graciosos. – maaartinus

+0

@maaartinus: '\ v' es una secuencia de escape tradicional para la pestaña vertical (en el mismo grupo que' \ n', '\ r', y así sucesivamente), y aunque Java no la admite en literales de cadenas (por sección 3.10.6 del JLS), hay algunas secuencias de escape similares que no son Java que admiten 'java.util.regex.Pattern' (' \ a' para alert/bell, '\ cX' para el carácter de control' X '). El único asunto divertido aquí, en mi humilde opinión, es la falta de correspondencia entre la documentación y la implementación: el Javadoc para 'Patrón' enumera todas las secuencias de escape que se supone que admite, incluyendo' \ n' y demás, y no menciona '\ v '. – ruakh

+1

Eso es todo. Creo que lo agregué a tu respuesta ya que esto era lo que me confundía. – maaartinus

8

perldoc perlrecharclass dice que \v coincide con un "carácter de espacio en blanco vertical". Esto se explica con más detalle:

"\ v" coincide con cualquier carácter que se considere espacios en blanco verticales; este incluye los caracteres de retorno de carro y alimentación de línea de la plataforma (nueva línea) más varios otros caracteres, todos enumerados en la tabla a continuación. "\ V" coincide con cualquier carácter que no se considere espacio en blanco vertical. Utilizan el juego de caracteres nativo de la plataforma y no consideran ninguna configuración local que de lo contrario podría estar en uso.

Específicamente, \v coincide con los siguientes caracteres en 5.16:

$ unichars -au '\v'   # From Unicode::Tussle 
---- U+0000A LINE FEED 
---- U+0000B LINE TABULATION 
---- U+0000C FORM FEED 
---- U+0000D CARRIAGE RETURN 
---- U+00085 NEXT LINE 
---- U+02028 LINE SEPARATOR 
---- U+02029 PARAGRAPH SEPARATOR 

se puede utilizar una clase de caracteres para obtener el mismo efecto que Perl de \v.

Por supuesto, esto se aplica a Perl; No sé si se aplica a Java.

+1

@ikegami: Buena edición, gracias. –

Cuestiones relacionadas