2009-08-08 53 views
11

¿Existe una declaración de expresiones regulares como \ w que denote todos los caracteres imprimibles? Me gustaría validar que una cadena solo contiene un carácter que se puede imprimir, es decir. no contiene caracteres de control ASCII como \ b (campana), nulo, etc. Cualquier cosa en el teclado está bien, al igual que los caracteres UTF.Regex para todos los caracteres de IMPRESIÓN

Si no hay una declaración especial, ¿cómo puedo especificar esto en una expresión regular?

+3

Si estaba buscando caracteres ASCII puros, podría ir con un Regex como '[- ~] +', que coincide con todos los ASCII bajos del espacio para tilde . – saluce

Respuesta

7

Hay una designación de clase de carácter POSIX [:print:] que debe coincidir con caracteres imprimibles, y [:cntrl:] para caracteres de control. Tenga en cuenta que estos códigos coinciden en toda la tabla ASCII, por lo que podrían no ser adecuados para hacer coincidir otras codificaciones.

En su defecto, la expresión [\x00-\x1f] coincidirá con los caracteres de control ASCII, aunque, de nuevo, estos podrían imprimirse en otras codificaciones.

1

Depende mucho del paquete de expresiones regulares que esté utilizando. Esta es una de estas situaciones sobre las cuales algunos dijeron que lo mejor de los estándares es que hay muchos para elegir.

Si usted está usando C, la función/macro isprint(3) es su amigo.

13

Si su sabor es compatible con expresiones regulares Unicode properties, esta es probablemente la mejor de la mejor manera:

\P{Cc} 

que coincide con cualquier carácter que no sea un carácter de control, ya sea ASCII - [\x00-\x1F\x7F] - o Latin1 - [\x80-\x9F] (también conocido como los caracteres de control C1).

El problema con las clases POSIX como [:print:] o \p{Print} es que pueden hacer coincidir diferentes cosas dependiendo del sabor de la expresión regular y, posiblemente, la configuración regional de la plataforma subyacente. En Java, están estrictamente orientados a ASCII. Eso significa que \p{Print} solo coincide con los caracteres de impresión ASCII - [\x20-\x7E] - mientras que \P{Cntrl} (tenga en cuenta la 'P' mayúscula) coincide con todo lo que es no un carácter de control ASCII - [^\x00-\x1F\x7F]. Es decir, coincide con cualquier carácter ASCII que no sea un carácter de control, o cualquier carácter que no sea ASCII, incluidos los caracteres de control C1.

8

Muy tarde para la fiesta, pero esta expresión regular funciona: /[ -~]/.

¿Cómo? Coincide con todos los caracteres en el rango de espacio (ASCII DEC 32) a tilde (ASCII DEC 126), que es el rango de todos los caracteres imprimibles.

Si desea eliminar caracteres no ASCII, podría utilizar algo como:

$someString.replace(/[^ -~]/g, ''); 

NOTA: esto no es válido código .net, pero un ejemplo de uso de expresiones regulares para los que se tropiezan con esto a través de la búsqueda motores más tarde.

0

Agregando a @ Alan-Moore, \P{Cc} es realmente como ejemplo de Negative Unicode Category or Unicode Block (ref: Character Classes in Regular Expressions). \P{name} coincide con cualquier carácter que no pertenece a una categoría general Unicode o bloque con nombre. Consulte el enlace referido para obtener más ejemplos de bloques con nombre admitidos en .NET

Cuestiones relacionadas