从.split string ruby​​中删除特殊字符

时间:2013-12-24 02:18:07

标签: ruby regex string

我使用ruby读取文件并使用.split分割行。

example.txt中

1

2

3

line1,line2,line3= @line.to_s.split("\n",3)
#actual
line1 => ["1
line2 => ", "2
line3 => ", "3"]
#what I expect
line1=1
line2=2
line3=3

我怎样才能得到我的预期?

编辑:这只是一个新行,因为我无法在我的问题中输入1个新行。更具体一点:

example.txt中

first_line \ nsecond_line \ nthird_line

File.open('Example.txt', 'r') do |f1|  
            @line = f1.readlines
            f1.close    
        end
line1,line2,line3= @line.to_s.split("\n",3)
    #actual
    line1 => ["first_line
    line2 => ", "second_line
    line3 => ", "third_line"]
    #what I expect
    line1=first_line
    line2=second_line
    line3=third_line

2 个答案:

答案 0 :(得分:4)

如果您尝试使用行结尾,则无法使用'\n'进行拆分。您必须使用"\n"

使用'\n'的字符串不会将\n解释为行结尾,而是将其视为字面反斜杠,后跟" n":

'\n' # => "\\n"
"\n" # => "\n"

问题根本没有明确,输入文件示例也没有给出显示的小示例代码,但是,猜测你想要的结果......

如果输入的文件名为' example.txt'看起来像:

1
2
3

您可以通过多种方式阅读:

File.read('example.txt').split("\n")
# => ["1", "2", "3"]

或者:

File.readlines('example.txt').map(&:chomp)
# => ["1", "2", "3"]

然而,无论是哪种工作,在将文件读入内存时都会设置非常糟糕的优先级。它被称为" slurping"并且如果文件大于可用内存,则可能会使代码崩溃或将其运行,以及运行它的计算机进行爬网。并且,即使它适合内存,将大文件加载到内存中也会导致暂停,因为内存已分配并重新分配。所以,不要这样做。

相反,逐行阅读文件并尽可能以这种方式处理:

File.foreach('example.txt') do |line|
  puts line
end
# >> 1
# >> 2
# >> 3

不要这样做:

File.open('Example.txt', 'r') do |f1|  
            @line = f1.readlines
            f1.close    
        end

Ruby会自动关闭这样打开的文件:

File.open('Example.txt', 'r') do |f1|
  ...
end

无需在块内使用close

答案 1 :(得分:0)

取决于您期望的具体内容(以及@line是什么)。如果您正在寻找数字,可以使用:

line1, line2, line3 = @line.to_s.scan(/\d/)

如果您想要其他角色,可以使用其他正则表达式。