
Estoy luchando por encontrar una expresión regular en notepad++ que encuentre y reemplace x número de bytes con nada. Recuentos de retorno de carro (0D), recuentos de avance de línea (0A).
Esta es la expresión regular que estoy probando: (0C es mi comienzo, estoy eliminando 318 bytes después de 0C junto con 0C)
\x0C(.{318})
Esta expresión regular no encuentra nada, dice que no se encontró ninguna coincidencia. Puedo encontrar \x0C
, y puedo encontrar .
pero no puedo encontrar, .{318}
también .
salta 0x0A y 0x0D
-Se marca el ajuste.
-Se comprueba la expresión regular.
Aquí tenéis parte del archivo en hexadecimal con ascii:
0C 30 31 32 27 34 35 36 0D 0A 30 61 32 0D 33 34 0A [snip] 0C 32 0A 0D 35 [etc..]
<ff>0 1 2 ' 4 5 6<cr><lf>0 a 2<cr> 3 4<lf>[snip]<ff> 2<lf><cr>5 [etc..]
Respuesta1
Como mencionaste que la codificación es us-ascii, podemos asumir que cada carácter es un byte. En expresiones regulares, el '.' coincide con cualquier carácter, excepto las nuevas líneas, y desea que cada parte individual de una nueva línea CR/LF coincida por separado, ya que son dos bytes.
También voy a suponer que está procesando datos de texto reales y no un archivo binario que puede contener bytes fuera del mapeo de caracteres us-ascii.
Si todo lo anterior es cierto, puede utilizar la siguiente expresión regular:
\x0C[^\xFF]{318}
La razón por la que '.' no funcionó en tu intento, es porque el '.' no coincide con las nuevas líneas. Tampoco puedes usar \x0C[.\r\n]{318}
, porque el '.' el comodín no está disponible dentro de una clase de carácter (grupo de corchetes). El valor hexadecimal FF no se asigna a ningún punto de código válido dentro del conjunto de caracteres us-ascii y, por lo tanto, cuando busque "cualquier carácter que no sea el carácter FF", estará tomandobytesen consideración.
Tenga en cuenta que este método cuenta las nuevas líneas de Windows/Mac como dos caracteres/bytes (según su solicitud).
Espero que esto sea lo que estabas buscando...
EDITAR: expresión regular explicada
Expresión completa
\x0C[^\xFF]{318}
Analicemos esto.
\x0C
Esto coincide con un grafema Unicode único, puede encontrar más información sobre estoaqui. En resumen, puedes considerar \x la versión Unicode del punto, excepto quetambién puede coincidir con saltos de línea(Esto es importante, más sobre esto más adelante).
Pero, como también usaste esto, supongo que ya estás parcialmente familiarizado con esto.
[^\xFF]
Todo lo que está entre [] se llamaConjunto de caracteres(no confundir con el mismo concepto en Codificación de caracteres). Puede leer más sobre esto en el Tutorial de Regexp, pero en resumen, sirve como una declaración "OR". [ab] simplemente significa "a o b". Cuando ^ se usa dentro de un juego de caracteres, sirve como negación. Entonces [^a] significa "no un". En nuestro caso de uso, buscamos cualquier carácter que no sea el valor HEX FF.
{318}
Y buscamos este tipo de personajes, 318 veces. La sintaxis {} siempre se aplica al elemento Regex justo delante de él, por lo que en este caso el juego de caracteres [^\xFF].
¿Por qué \xFF?
En notación hexadecimal, el conjunto de caracteres us-ascii esdesde 00 hasta 7E. Cualquier valor superior no se puede asignar a un punto de código us-ascii. Esto significa que cualquier archivo codificado (correctamente) en us-ascii solo puede contener valores HEX entre 00 y 7E. Como resultado, no puede contener FF.
Por lo tanto, podemos hacer un uso inteligente de esto para buscar cualquier carácter, incluidos los caracteres de nueva línea, ya que \x.. también coincide con líneas nuevas como \x0A y \x0C. Cuando buscamos cualquier personaje que seanoFF, terminamos encontrandocadapersonaje.
Tenga en cuenta que esta solución depende del hecho de que su archivo esté codificado en us-ascii y no en UTF-8.