stdin不起作用红宝石

时间:2011-04-13 10:43:09

标签: ruby

我有以下脚本:

$stdin.each_line do |data|    
  blocks = data.scan(/\+[^+]+\+/)
  blocks.reject! { |b| b.include? "AAAAAAAAA" }    
  p blocks    
end

此脚本将删除stdin文件中的A字符串。我有两个问题:

  1. stdin似乎不起作用,输出[]
  2. 如何修改脚本以说拒绝一段长度为20或以上的单个字母,因此如果有20个或更多A的延伸,则删除该块。

2 个答案:

答案 0 :(得分:0)

拒绝具有20个或更多相同大写字符的所有块:

$stdin.each_line do |data|
  blocks = data.scan(/\+[^+]+\+/)
  ('A'..'Z').each do |ch|
    r = Regexp.new("[" + ch + "]{20,}")
    blocks.reject! { |b| r =~ b }
  end
  p blocks
end

这构建了26个正则表达式(每个大写字符一个)并匹配块 当然,将它们构建一次并将它们存储在数组或类似物中而不是为输入中的每一行重建它们会更有效。

更紧凑的解决方案:

  r = /([a-z])\1{19,}/
  $stdin.each_line do |data|
      blocks = data.scan(/\+[^+]+\+/)
      blocks.reject! { |b| r =~ b }
      p blocks
  end

这个使用单个正则表达式来匹配单个字符,然后直接使用相同字符出现19个或更多(使用后引用)。

答案 1 :(得分:0)

拒绝的正则表达式!声明是:

/([A-Z])\1{19}/

这匹配任何大写字母后跟19个完全相同的字母。