2011-06-13 15 views
10

Al tratar de responder la pregunta Writing text into new line when a particular character is found, he empleado Regexp::Grammars. Me ha interesado por mucho tiempo y finalmente tuve una razón para aprender. Noté que la sección de descripción que el autor tiene un analizador de látex (Soy un usuario ávido de látex, por lo que este interesado mí) pero se ha visto una construcción extraña aquí:¿Qué hace una clase de personaje con solo un caret?

<rule: Option>  [^][\$&%#_{}~^\s,]+ 

    <rule: Literal> [^][\$&%#_{}~^\s]+ 

¿Qué logran los [^] clases de personajes?

Respuesta

20

[^][…] no es de dos clases de personajes, pero sólo una clase de caracteres que contenga cualquier otro carácter excepto ], [, y (ver Special Characters Inside a Bracketed Character Class):

Sin embargo, si el ] es el primera (o el segundo si el primer carácter es un carácter de una clase de carácter entre corchetes, no denota el final de la clase (ya que no se puede tener una clase vacía) y se considera parte del conjunto de caracteres que pueden combinarse sin escaparse.

Ejemplos:

"+" =~ /[+?*]/  # Match, "+" in a character class is not special. 
"\cH" =~ /[\b]/  # Match, \b inside in a character class 
        # is equivalent to a backspace. 
"]" =~ /[][]/  # Match, as the character class contains. 
        # both [ and ]. 
"[]" =~ /[[]]/  # Match, the pattern contains a character class 
        # containing just ], and the character class is 
        # followed by a ]. 
+0

@Gumbo Si se puede afirmar con certeza que así es como Perl analiza la expresión regular, voy a borrar mi respuesta (incorrecta). ¿Estas seguro? – Phrogz

+0

@Phrogz, así es como Perl lo maneja. – Qtax

+0

@Gumbo, que parece coincidir más con lo que el analizador LaTeX necesitaría, ¿es eso en los documentos en algún lugar?!?! –

Cuestiones relacionadas