如何使用正则表达式扩展给定参数的路径?

时间:2015-04-26 16:13:35

标签: ruby regex command-line

我正在开发一个简单的搜索工具。它搜索命令行参数定义的目录中的源代码文件,例如:

finder 'path' 'keyword'

我在如何正确地将给定参数转换为路径字符串方面遇到了困难,我可以在 Dir.chdir(路径)中使用它。这就是我的意思,根据我的逻辑,我有4个不同的案例:

  • 。 (只是当前目录)
  • /文件夹
  • ./文件夹
  • 〜/桌面/文件夹

以下是我现在所拥有的:

def expand_path(path)
  case path
  when '.'
   return '.'
  when /\/[a-z]*/.match(path)
   return Dir.pwd + path
  when /\.\/[a-z]*/.match(path)
   return Dir.pwd + path[1..-1]
  when /~(\/[a-zA-Z\w]*)+/.match(path)
   return File.expand_path(path, __FILE__)
  else
   puts "Wrong path name"
  end
end

我不确定是否有更好的方法,这就是我想出来的。 尽管如此,我的方法并不奏效。我不确定正则表达式或其他内容是否存在问题。我是Ruby世界的新手,所以,我可能只是犯了一些愚蠢的错误。

[解决]

  def expand_path(path)
   case path
   when '.'
     return '.'
   when /~(\/[a-zA-Z\w]*)+/
     return File.expand_path(path, __FILE__)    
   when /\.\/[a-z]*/
     return Dir.pwd + path[1..-1]
   when /\/[a-z]*/
     return Dir.pwd + path

   else
     puts "Wrong path name"
   end
  end

1 个答案:

答案 0 :(得分:1)

如你所说,问题已经解决了,你的正则表达式中至少有1点可以改进,[a-zA-Z\w]可以只用\w替换,因为它已经包含{ {1}}。

来自regular-expressions.info

  

\ w代表"单词字符"。它始终与ASCII字符匹配   [A-ZA-Z0-9_]。请注意包含下划线和数字。

此外,您的上一个a-zA-Z包含仅与when匹配的/\/[a-z]*/正则表达式。如果这是您想要的,那么好吧,如果没有,请将/替换为*+也是如此 - 它将匹配/\.\/[a-z]*/。如果您想匹配./ +至少1个字符,则需要用加号替换adterisk。

所以,我建议:

./