Forum: Rails-ES Más de expresiones regulares

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Luis V. (Guest)
on 2007-07-31 19:44
(Received via mailing list)
Buenas, a ver si me entero de cómo hacer cosas con expresiones
regulares,
porque no me aclaro. Llevo un par de horas con el método prueba-error
para
sacar algo y no hay manera.

El es que lo que quiero es sacar de una sentencia sql, las columnas a
las
que se hace consulta.

Y estos son los 3 posibles casos:

select a.login, a.nombre from usuarios
select a.login as acceso, a.nombre as el_nombre from usuarios
select a.login acceso, a.nombre el_nombre from usuarios

Sé que hacerlo es algo tan fácil como crear una expresión regular que
haga
lo siguiente:
-corte lo que hay entre el select y el from,
-del resultado sacar lo que está separado por las comas,
-y de cada uno de los elementos resultantes, sacar lo que hay más a la
derecha, separado por espacio o punto...

Yo lo he hecho a lo bruto, pero me molesta tener que codificar tanto
pudiendo hacerlo mucho más fácil.
Me queda así:

    query = "select a.login acceso, a.nombre as el_nombre, a.password
from
usuarios"
    aux = query.downcase.split(/from/)[0]
    array_aux = aux.gsub(/select/,"").split(",")
    retorno = []
    array_aux.each do |cadena|
      aux = cadena.strip
      for aux2 in aux.split(" ")
        aux2
      end
      aux2 = aux2.split(".")[1] if aux2=~/\./
      retorno << aux2
    end
    retorno
Xavier N. (Guest)
on 2007-07-31 23:57
(Received via mailing list)
El Jul 31, 2007, a las 5:43 PM, Luis V.
escribió:
> select a.login as acceso, a.nombre as el_nombre from usuarios
> select a.login acceso, a.nombre el_nombre from usuarios
>
> Sé que hacerlo es algo tan fácil como crear una expresión regular
> que haga lo siguiente:
> -corte lo que hay entre el select y el from,
> -del resultado sacar lo que está separado por las comas,
> -y de cada uno de los elementos resultantes, sacar lo que hay más a
> la derecha, separado por espacio o punto...

Podria ser algo asi:

   query = "select a.login acceso, a.nombre as el_nombre, a.password
from usuarios"
   query =~ /^select(.*?)\bfrom\b/i
   columns = $1.strip.split(/\s*,\s*/)
   columns.map {|c| puts c.split(/[ .]/)[-1]}

En la regexp

   /^select(.*?)\bfrom\b/i

aprovechamos el hecho de que "from" no puede ser nombre de columna o
alias por ser una palabra reservada.

-- fxn
Luis V. (Guest)
on 2007-08-01 11:57
(Received via mailing list)
Funciona estupendamente. Muchas gracias
This topic is locked and can not be replied to.