我有以下脚本:
$stdin.each_line do |data|
blocks = data.scan(/\+[^+]+\+/)
blocks.reject! { |b| b.include? "AAAAAAAAA" }
p blocks
end
此脚本将删除stdin文件中的A字符串。我有两个问题:
[]
。答案 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个完全相同的字母。