将正则表达式作为脚本参数传递Ruby
问题描述:
我试图传递正则表达式来逐行处理文件。正则表达式工作正常,如果我在代码中硬编码它,像这样。将正则表达式作为脚本参数传递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
答
您可以通过正则表达式的内部位为一个字符串,然后转换它正则表达式后如:
ruby md5.rb -h "[0-9a-f]{32}"
将字符串转换成正则表达式,只需使用插值:
regex = /#{regex_string}/i
除了插值之外,还可以使用'Regexp.new(regex_string)',如果表达式无效,将会抛出'RegexpError'。 –