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

How to expand path from given argument using regular expression?

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

finder 'path' 'keyword'

我在如何正确地将给定参数转换为我可以在 Dir.chdir(path) 中使用的路径字符串时遇到困难。这就是我的意思,根据我的逻辑,我有 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 点可以改进,即 [a-zA-Z\w] 可以只用 \w 代替,因为它已经包括 a-zA-Z.

来自 regular-expressions.info:

\w stands for "word character". It always matches the ASCII characters [A-Za-z0-9_]. Notice the inclusion of the underscore and digits.

此外,您的最后一个 when 包含 /\/[a-z]*/ 也仅匹配 / 的正则表达式。如果那是您想要的,好的,如果不是,请将 * 替换为 +/\.\/[a-z]*/ 也是如此——它将匹配 ./。如果要匹配 ./ + 至少 1 个字符,则需要将 adterisk 替换为加号。

所以,我建议:

def expand_path(path)
   case path
   when '.'
     return '.'
   when /~(\/\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