查看一行的开头是否与正则表达式字符匹配

时间:2015-10-06 16:33:12

标签: ruby string

文件中的行包含!。我需要所有其他线路。我只想在文件中打印不以感叹号开头的行。

到目前为止我写的代码行是:

unless parts.each_line.split("\n" =~ /^!/)
  # other bit of nested code
end

但它不起作用。我该怎么做?

2 个答案:

答案 0 :(得分:2)

首先,我要使用:

File.foreach('foo.txt') do |li|
  next if li[0] == '!'
  puts li
end

foreach非常快,允许您的代码处理任何大小的文件 - "可扩展"是这个词。见" Why is "slurping" a file not a good practice?"了解更多信息。

li[0]是Ruby中常见的习惯用语,用于获取字符串的第一个字符。同样,它非常快,是我最喜欢的方式,但考虑这些测试:

require 'fruity'

STR = '!' + ('a'..'z').to_a.join # => "!abcdefghijklmnopqrstuvwxyz"

compare do
  _slice { STR[0] == '!' }
  _start_with { STR.start_with?('!') }
  _regex { !!STR[/^!/] }
end

# >> Running each test 32768 times. Test will take about 2 seconds.
# >> _start_with is faster than _slice by 2x ± 1.0
# >> _slice is similar to _regex

使用start_with?(或其字符串结束等效end_with?)的速度提高了一倍,从现在开始,我似乎正在使用start_with?end_with?

将其与foreach相结合,您的代码将有可能快速有效。

参见" What is the fastest way to compare the start or end of a String with a sub-string using Ruby?"了解更多信息。

答案 1 :(得分:0)

您可以使用string#start_with查找以特定字符串开头的行。

file = File.open('file.txt').read
file.each_line do |line|
  unless line.start_with?('!')
    print line
  end
end

您还可以检查第一个字符的索引

unless line[0] === "!"

您也可以使用Regex

执行此操作
unless line.scan(/^!/).length