Porque é que a última expressão na minha expressão regular concatenando ao primeiro?

votos
0

A linguagem é Ruby, aqui é a minha sessão irb

expr = /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/
=> /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/

/> str = select from Entity order by value desc
=> select from Entity order by value desc

/> expr =~ str
=> 0

/> $1
=> Entity order by value desc

/> $2
=> nil

Eu só não entendo por que estou recebendo ordem Entity por valor desc quanto $ 1. O comportamento desejado aqui seria para obter US $ 1 => Entidade, US $ 2 => valor, $ 3 => desc. O que estou fazendo de errado? Como faço para modificar esta expressão regular assim que eu conseguir estes resultados?

Obrigado

Publicado 27/08/2009 em 02:07
fonte usuário
Em outras línguas...                            


2 respostas

votos
4

\ D é "não dígitos", que abrange o espaço entre as palavras, bem como as seguintes palavras. Tente (\ S +) em seu lugar.

[Editar] Desculpe, eu perdi a questão no final. As respostas acima do 'por que isso acontece?', Mas não 'como posso conseguir o que eu queria?'. Aqui está uma maneira, ignorando quaisquer outras cláusulas com um. *

/\Aselect from (\S+).*(?:order by (\S+) (asc|desc)?)?\Z/

Desde SQL é bastante livre com espaçamento e como entre palavras-chave, que você gostaria de torná-lo mais ilegível e usar \ s + em vez de espaços literais. Ou seja, a expressão tal como está não jogo:

"select   from     Fred"

mas seria se você fez / \ ASeleccione \ s + de \ s + ....

Respondeu 27/08/2009 em 02:12
fonte usuário

votos
1

O (\D+)é ganancioso e comeu o resto do string. Uma vez que tudo o resto na sua expressão é opcional (* ou?), Não há necessidade de combiná-lo para a expressão de sucesso.

Minha sugestão é para fazer seus jogos menos ganancioso. por exemplo, (\D+?)irá corresponder e capturar qualquer não-dígito uma ou mais vezes, mas como poucas vezes for necessário para fazer um jogo bem sucedido.

Respondeu 27/08/2009 em 07:13
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more