微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

stdin不起作用ruby

如何解决stdin不起作用ruby

| 我有以下脚本:
$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个字母。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。