拆分字符串而不删除分隔符

我需要解析一个文件来获取单独的SQL语句并从rails控制器运行它们。

我有以下代码:

@sql_file = "#{RAILS_ROOT}/lib/evidence_interface_import.sql" @sql_stmts_array = File.read(@sql_file).split(";") @sql_stmts_array.each_with_index do |sql_stmt,s_index| ActiveRecord::Base.connection.execute(sql_stmt) end 

拆分删除“;” 从SQL结束。 有没有办法不删除“;” 并仍然使用“;”拆分。

是的, scan一下:

 'a; b; c;'.scan(/[^;]*;/) #=> ["a;", " b;", " c;"] 

您可以通过在map(&:strip)之后添加来消除多余的空白,但这可能不需要。

请注意,这是非常基本的,并且SQL中带有分号的字符串文字会破坏这一点。 (例如, select * from stuff where name = ";"; 。)

使用ActiveRecord::Base.connection.execute您不需要首先包含分号。

另外,在不删除分隔符的情况下拆分的另一种方法是使用组,如以下示例所示:

 "a;b;c".split(/;/) # => ["a", "b", "c"] "a;b;c".split(/(;)/) # => ["a", ";", "b", ";", "c"] 

使用带有lookbehind的正则表达式

 split(/(?<=;)/) 

这有效:

 @sql_stmts_array = File.read(@sql_file).lines(separator=';') 

您可以尝试使用具有适当正则表达式的scan ,这应该会给您类似于split结果,但是如果您想坚持使用没有正则表达式的方法,您只需在数组中的每个单元格后面添加一个分号:

 @sql_stmts_array = File.read(@sql_file).split(";").each do |s| s << ";" end