2010-04-05 12 views
20

Tengo una fuente de texto con nulos y tengo que sacarlos junto con mi patrón de expresión regular. ¿Puede Regex incluso coincidir con un carácter nulo?¿Puede PCRE regex coincidir con un carácter nulo?

Solo me di cuenta de que los tenía cuando mi patrón no coincidía y cuando lo pegué en Notepad ++ mostraba todos los caracteres nulos.

Respuesta

35
\x00 

Eso es un char nulo.

+0

gracias. Funciona de maravilla, pero no puedo usar ninguna de mis herramientas 'visuales' para trabajar con el nulo, pero el Grep de Regex Buddy lo hará detrás de escena. – Keng

+0

Parece que ['\ x0' debería funcionar] (http://superuser.com/a/287998/2259) también. – l0b0

+0

No debería hacer '\ x0' a menos que sea lo único que coincida. si estabas tratando de hacer coincidir '\ x0apple' que iba a tratar de hacer coincidir con' \ npple' – Augwa

1

Un problema al hacer coincidir el carácter nulo es que primero necesita hacer arreglos para que llegue. Muchos idiomas usan cadenas terminadas en nulo, por lo que su coincidencia puede no estar en contra de toda la entrada.

En cuanto a cómo expresarlo en PCRE, \ 000 funciona y no va a ser interrumpido por nada que lo siga, como lo haría \ x {} (pero la versión octal es en mi opinión más fácil de identificar cuando se roza el regex).

Ver the PCRE manpages y la búsqueda de caracteres no imprimibles de todos los detalles de cómo especificar un valor nulo de varias maneras diferentes.

+0

dirección actual http://www.pcre.org/original /doc/html/pcrepattern.html#SEC5 – test30

1

Para aclarar/agregar otro detalle a la respuesta anterior: la biblioteca PCRE acepta el patrón como una cadena terminada en nulo "C". (Citando documentos PCRE: "El patrón es una cadena C terminada por un cero binario"). Eso significa que el patrón no puede contener un carácter literal NUL; en su lugar, siempre se debe evitar utilizando los medios descritos en otras respuestas. ("A diferencia de la cadena del patrón, el sujeto puede contener ceros binarios." "4. Aunque los caracteres binarios cero son compatibles con la cadena del asunto, no están permitidos en una cadena de patrón porque se pasa como un 0-mal C string, terminada por cero la secuencia de escape \ 0 se puede utilizar en el patrón para representar un cero binario ")

carácter NUL es el único personaje en el patrón de PCRE que debe ser escapado, todos los demás pueden ir literal..: "No existe ninguna restricción en la apariencia de los caracteres que no se imprimen, además del cero binario que termina un patrón".

Como nota final comparativa, algunos otros motores de expresiones regulares compatibles con Perl permiten NUL literales en un patrón, por ejemplo, el SRE de Python. P.ej. urlib.parse de Python3 tiene la siguiente línea: _asciire = re.compile('([\x00-\x7f]+)'). Nótese la falta de "r" para significar el literal sin procesar, significa que el desapapeleo aquí ocurre en el nivel de Python, y el módulo re obtiene los caracteres con los valores 0x00 y 0x7f en el patrón.

Cuestiones relacionadas