2011-04-13 57 views
-1

我有以下脚本:标准输入不起作用红宝石

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

该脚本将删除的那串在一个标准输入文件。我有两个问题:

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

你如何发送输入?你还可以添加你想要的测试输入/输出吗? – Dogbert 2011-04-13 10:45:48

+1

你是什么意思的“它不工作”?如果我执行脚本并输入+ AAAAA ++ BBBBB ++ AAAAAAAAAAAAAAAAAAAAAAAAA +我会得到 [“+ AAAAA +”,“+ BBBBB +”]。 – 2011-04-13 10:47:49

+0

我认为你的正则表达式不是你正在寻找的。 – 2011-04-13 10:52:57

回答

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个或更多OCCURENCES直接之后(使用反参考)。

+0

不知道为什么它输出[],没有别的! – Mark 2011-04-13 12:05:50

+0

你测试过了吗?如果您运行此脚本并在一行中输入+ AAAAA ++ BBBBB ++ AAAAAAAAAAAAAAAAAAAAAAAAA +,就会像预期的那样获得[“+ AAAAA +”,“+ BBBBB +”]。如果这不符合您的期望,请解释您正在努力实现的目标。 – 2011-04-13 14:00:46

+0

当我运行脚本时,我有一个包含许多+/n到/ n +的文件,当我输入数据文件编号时,它只输出[]。任何想法为什么?谢谢 – Mark 2011-04-13 14:39:33

0

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

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

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