ARGV总是通过正则表达式匹配失败

时间:2016-01-19 20:07:00

标签: ruby regex digits

我有一个程序正在制作,它将从大型tarball中解决电子表格问题。它将通过ARGV[0]提供一个数字来执行此操作,然后它将运行与之前提到的大型tarball对应的文本文件列表,一旦找到文本文件,它就可以找到正确的tarball来提取从...

但是,我已将其设置为必须通过ARGV检查所提供的数字,然后才能使用此功能运行搜索:/^\d{4,7}/ 问题是它一直默认为:USAGE: unarchive_ss <folio number>

我为什么会这样做有点困惑?任何人都可以向我解释这里发生了什么......?

我也试过了:

  • /\A\d{7}\z/
  • /\d{7}/

来源:

#!/usr/local/bin/ruby

require 'rubygems/package'
require 'fileutils'
require 'zlib'

class ArchiveManager

  attr_accessor :folio_num

  def initialize(folio_num)
    @folio_num = folio_num
  end

  def num_check
    if folio_num =~ /^\d{4,7}/
      search_for_spreadsheet
    else
      puts <<-EOF

        USAGE: unarchive_ss <folio number>

      EOF
    end
  end

  def search_for_spreadsheet
    location = FileUtils.chdir("path/to/file")
    location
    digits = `grep -lr #{folio_num}.ods *.txt`
    file_name = digits.match(/\d+/).to_s
    puts file_name
  end
end
#/2715015
test = ArchiveManager.new(ARGV[0])
test.num_check

示例:

[]$ ruby unarchive_ss 2715015

        USAGE: unarchive_ss <folio number>

[]$ 
[]$ ruby unarchive_ss 271501 

        USAGE: unarchive_ss <folio number>

[]$ 
[]$ ruby unarchive_ss 1111111

        USAGE: unarchive_ss <folio number>

[]$ ruby unarchive_ss 111    

        USAGE: unarchive_ss <folio number>

[]$ 

1 个答案:

答案 0 :(得分:1)

num_check中的正则表达式中存在一个潜在的问题:

if folio_num =~ /^\d{4,7}/

测试该模式显示了一个漏洞:

'123'[/^\d{4,7}/]      # => nil
'1234'[/^\d{4,7}/]     # => "1234"
'1234567'[/^\d{4,7}/]  # => "1234567"
'12345678'[/^\d{4,7}/] # => "1234567"

对于任何超过预期的数字,你都会得到“真实”。

一个简单的解决方法是:

'12345678'[/^\d{4,7}$/] # => nil

只需添加$即可抓住该行的结尾。