2011-04-13 62 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個完全相同的字母。