validar solo regulares regular que personas para numeros nombres mayores letras expresiones expresion espacios ejemplo crear cadena alfanumerico ruby regex rar

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 bytes

0x0100 - 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?