ruby - solo - validar cadena javascript expresion regular
Expresión regular para hacer coincidir solo el primer archivo en un conjunto de archivos RAR (4)
Para ver qué archivo invocar el comando unrar, uno necesita determinar qué archivo es el primero en el conjunto de archivos.
Aquí hay algunos ejemplos de nombres de archivo, de los cuales, naturalmente, solo el primer grupo debe coincidir:
yes.rar
yes.part1.rar
yes.part01.rar
yes.part001.rar
no.part2.rar
no.part02.rar
no.part002.rar
no.part011.rar
Una forma (limitada) de hacerlo con expresiones regulares compatibles con PCRE es esta:
.*(?:(?<!part/d/d/d|part/d/d|/d)/.rar|/.part0*1/.rar)
Sin embargo, esto no funcionó en Ruby cuando lo probé en Rejax .
¿Cómo escribiría una expresión regular compatible con Ruby para que coincida solo con el primer archivo de un conjunto de archivos RAR?
La respuesta corta es que no es posible construir una sola expresión regular para satisfacer su problema. Ruby 1.8 no tiene aserciones alternativas (las cosas (? <! En su expresión regular de ejemplo) y por eso su expresión regular no funciona. Esto le deja con dos opciones.
1) Usa más de una expresión regular para hacerlo.
def is_first_rar(filename)
if ((filename =~ /part(/d+)/.rar$/) == nil)
return (filename =~ //.rar$/) != nil
else
return $1.to_i == 1
end
end
2) Usa el motor de expresiones regulares para ruby 1.9, Oniguruma . Es compatible con las afirmaciones de lookaround, y puede instalarlo como una joya para ruby 1.8 . Después de eso, puedes hacer algo como esto:
def is_first_rar(filename)
reg = Oniguruma::ORegexp.new(''.*(?:(?<!part/d/d/d|part/d/d|/d)/.rar|/.part0*1/.rar)'')
match = reg.match(filename)
return match != nil
end
No confíe en los nombres de los archivos para determinar cuál es el primero. Vas a encontrar un caso extremo donde obtienes el archivo incorrecto.
Los encabezados de RAR le indicarán qué archivo es el primero en el volumen, suponiendo que se crearon en una versión algo reciente de RAR.
HEAD_FLAGS Banderas de bits:
2 bytes0x0100 - Primer volumen (establecido solo por RAR 3.0 y posterior)
Así que abra cada archivo y examine los encabezados RAR, buscando específicamente el indicador que indica qué archivo es el primer volumen. Esto nunca fallará, siempre y cuando el archivo no esté dañado. He hecho mis propias pruebas con los archivos RAR extendidos y sus encabezados son correctos de acuerdo con el enlace de arriba.
Esta es una forma mucho más segura de determinar qué archivo es el primero en un conjunto como este.
No soy experto en expresiones regulares pero este es mi intento
^(yes|no)/.(rar|part0*1/.rar)$
Reemplazar "sí | no" con el nombre del archivo real. Lo comparé con tus ejemplos para ver si solo coincidiría con el primer conjunto, de ahí el "sí | no" en la expresión regular.
ACTUALIZACIÓN: corregido según el comentario. No estoy seguro de por qué el usuario no sabría el nombre del archivo, así que no arreglé esa parte ...
Personalmente, no usaría expresiones regulares (extendidas) en este caso (o al menos no una para hacerlo todo). ¿Qué hay de malo en codificar esto en, por ejemplo, algunos if
s?