2015-11-03 131 views
0

我试图传递正则表达式来逐行处理文件。正则表达式工作正常,如果我在代码中硬编码它,像这样。将正则表达式作为脚本参数传递Ruby

File.foreach(filename).with_index do |line, line_num| 
    md5 = line.scan(/[0-9a-f]{32}/i) 
    puts md5 
end 

这工作很好,我可以看到每一行上有MD5哈希打印。现在,问题是当我尝试通过正则表达式匹配MD5哈希像一个脚本参数:

ruby md5.rb -h "/[0-9a-f]{32}/i"

options = {} 
OptionParser.new do |opts| 
    opts.on('-h', '--hash "<hash regex>"', 'Hash Regex') { |v| options[:hash] = v } 
end.parse! 

hash = options[:hash] 
File.foreach(filename).with_index do |line, line_num| 
    md5 = line.scan(hash) 
    puts md5 
end 

回答

1

您可以通过正则表达式的内部位为一个字符串,然后转换它正则表达式后如:

ruby md5.rb -h "[0-9a-f]{32}" 

将字符串转换成正则表达式,只需使用插值:

regex = /#{regex_string}/i 
+2

除了插值之外,还可以使用'Regexp.new(regex_string)',如果表达式无效,将会抛出'RegexpError'。 –