Atualmente, estou tentando rexp uma seqüência de caracteres em várias variáveis. Exemplo de sequência:
ryan_string = "RyanOnRails: This is a test"
Combinei com este regexp, com 3 grupos:
ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)
Agora, para acessar cada grupo, tenho que fazer algo assim:
ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test
Isso parece bastante ridículo e parece que estou fazendo algo errado. Eu esperaria poder fazer algo assim:
g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)
Isso é possível? Ou existe uma maneira melhor do que como estou fazendo isso?
fonte
one, two, three = string.match(/(^.*)(:)(.*)/i).captures
para:one, two, three = string.match(/(^.*)(:)(.*)/i).try(:captures)
&.
usar o novo operador para recuperá-lo em uma linha e até usá-lo duas vezes quando houver apenas um grupo de captura. Ex ..,string.match(regex)&.captures&.first
Você pode usar Match ou = ~ em vez disso, o que forneceria uma única correspondência e você poderia acessar os dados da correspondência da mesma maneira ou apenas usar as variáveis de correspondência especiais $ 1, $ 2, $ 3
Algo como:
fonte
Você pode nomear suas correspondências capturadas
Não funciona se você reverter a ordem da sequência e a expressão regular.
fonte
Você precisa decidir se é uma boa ideia, mas o ruby regexp pode (automagicamente) definir variáveis locais para você!
Ainda não tenho certeza se esse recurso é incrível ou apenas totalmente louco, mas seu regex pode definir variáveis locais.
(Dê uma olhada em http://ruby-doc.org/core-2.1.1/Regexp.html , procure por "variável local").
Nota: Como indicado em um comentário, vejo que há uma resposta semelhante e anterior a esta pergunta por @toonsend ( https://stackoverflow.com/a/21412455 ). Eu não acho que estava "roubando", mas se você quiser ser justo com elogios e honrar a primeira resposta, fique à vontade :) Espero que nenhum animal tenha sido ferido.
fonte
scan()
encontrará todas as correspondências não sobrepostas da regex na sua string. Portanto, em vez de retornar uma matriz de seus grupos como você espera, ela retornará uma matriz de matrizes.Provavelmente, é melhor usar
match()
e obter a matriz de capturas usandoMatchData#captures
:No entanto, você também pode fazer isso
scan()
se quiser:fonte