2016-06-10 1 views

Répondre

1
▶ text.scan(/rename_table.+:(\w+)\s*$/).flatten 
#⇒ [ 
# [0] "vendors", 
# [1] "venues" 
# ] 
2

Quelque chose comme cela pourrait fonctionner pour vous:

/rename_table.+:(\S+)/g 

Il mémorise le dernier mot préfixé par : forment des lignes contenant rename_table (vendors, venues) dans le groupe de correspondance $1.

Try it online

1

$ Vous n'avez pas besoin regexes:

str = %q{ 
class Rename < ActiveRecord::Migration 
    def change 
    rename_table :users, :vendors 
    rename_table :places, :venues 
    end 
end 
} 

str.each_line do |line| 
    puts line.split[-1] if line.lstrip.start_with? 'rename_table' 
end 

--output:-- 
:vendors 
:venues 

Dans tous les cas, le groupe en votre regex est ([]+). Les crochets sont des caractères regex spéciaux et ils représentent une classe de caractères , dans laquelle vous spécifiez les caractères que vous souhaitez faire correspondre, par ex. [xyz]. Cette classe de caractères correspond à un caractère x ou y ou z. Dans votre cas, la classe de caractères est vide, ce qui produit une erreur Ruby 2.2:

char-classe vide: /rename_table.*([]+)$/

Essentiellement, le rubis est disant: Wtf??! You specified a character class with no characters. Are you really trying to say, I want to match one character that is in the character class consisting of no characters?. I don't think so! Error! Error! Error!

+0

Je pense que OP veut 'vendors' et' venues' qui ne sont pas préfixé par ':' ' – andlrc

+0

line.split met [-1] [1 ..- 1]' – 7stud