2011-02-04 20 views
5

Estoy tratando de hacer coincidir un carácter de control en la forma \^c donde c es cualquier carácter válido para los caracteres de control. Tengo esta expresión regular, pero actualmente no está funcionando: \\[^][@-z]¿Qué es una expresión regular para los caracteres de control?

Creo que el problema radica en el hecho de que el carácter de intercalación (^) es parte del motor de análisis de expresiones regulares.

+0

Eso no tiene sentido para mí. ¿Hay una barra invertida allí? ¿Estos caracteres de control reales, o alguna secuencia ASCII implica lo mismo? ¿Por qué solo ir \ c @ .. \ cZ? Hay otros, ya sabes. – tchrist

+0

¿Por qué estás poniendo el cursor en una clase de personaje de todos modos? –

+0

Estoy tratando de hacer coincidir el texto literal para los caracteres de control, no los propios caracteres de control. –

Respuesta

7

Haga coincidir una cadena de texto ASCII del formulario ^X usando el patrón \^., nada más. Haga coincidir una cadena de texto ASCII del formulario \^X con el patrón \\\^.. Es posible que desee restringir ese punto a [[email protected]_\[\]^\\], por lo que \\\^[[email protected]_\[\]^\\]. Es más fácil leer como [?\x40-\x5F] para la clase de caracteres entre corchetes, de ahí \\\^[?\x40-\x5F] para un RETROCESO literal, seguido de un CIRCUMFLEX literal, seguido de algo que se convierte en uno de los caracteres de control válidos.

Tenga en cuenta que ese es el resultado de imprimir el patrón, o lo que habría leído de un archivo. Es lo que necesita pasar al compilador de expresiones regulares. Si lo tiene como un literal de cadena, debe, por supuesto, duplicar cada una de esas barras invertidas. `\\\\\\^[?\\x40-\\x5F]" Sí, es una locura, pero es porque Java no admite expresiones directas directamente como Groovy y Scala, o Perl y Ruby. El trabajo de Regex siempre es más fácil sin el extra de bbaacckksslllllaasshheesssssess. :)

Si tuviera caracteres de control reales en lugar de representaciones indirectas de ellas, se usaría \pC para todos los puntos de código literal con la propiedad GC = Otro o \p{Cc} por sólo GC = control.

+0

No estoy muy seguro de entender \ pC. Estoy escribiendo un analizador léxico usando JLex y necesito reconocer secuencias de caracteres de control válidas en una cadena y traducirlas a sus equivalentes ASCII. Por ejemplo, la cadena "\^g" imprimirá el carácter de campana o hará que el parlante de la computadora pite. Necesito una expresión regular para unir secuencias de caracteres de control como "\^g". –

+0

@pcman: ¿Tiene un RETROCESO literal seguido de un CIRCUMFLEX literal seguido de un carácter que es uno de '[A-Z @? \ [\] _ ^]'? – tchrist

+0

Sí, estoy tratando de hacer coincidir el texto literal como aparecería en una cadena. –

2

Mira esto: http://www.regular-expressions.info/characters.html. Debería poder usar \ cA to \ cZ para encontrar los caracteres de control.

+1

¿Qué hay de '\ c?' Para DELETE (U + 7F)? ¿Sabías que Java piensa '\ c {' is ';' y que '\ c;' es '{'? Olvidó comprobar que el resultado es '\ p {Cc}'. Oops! – tchrist

Cuestiones relacionadas