问题描述
|
我有以下脚本:
$stdin.each_line do |data|
blocks = data.scan(/\\+[^+]+\\+/)
blocks.reject! { |b| b.include? \"AAAAAAAAA\" }
p blocks
end
该脚本将删除stdin文件中的A \字符串。我有两个问题:
标准输入似乎无效,它输出[]
。
如何修改脚本以拒绝包含长度为20或大于20的单个字母,所以如果存在20个或更多的A \,请删除该块。
解决方法
拒绝所有具有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个或更多匹配项。
,您拒绝的正则表达式!声明是:
/([A-Z])\\1{19}/
这将匹配任何大写字母,然后再匹配完全相同的19个字母。