我有一个程序正在制作,它将从大型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>
[]$
答案 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
只需添加$
即可抓住该行的结尾。