如何使用正则表达式从给定参数扩展路径?
How to expand path from given argument using regular expression?
我正在开发一个简单的搜索工具。它在命令行参数定义的目录中搜索源代码文件,例如:
finder 'path' 'keyword'
我在如何正确地将给定参数转换为我可以在 Dir.chdir(path) 中使用的路径字符串时遇到困难。这就是我的意思,根据我的逻辑,我有 4 种不同的情况:
- 。 (只是当前目录)
- /文件夹
- ./文件夹
- ~/Desktop/folder
这是我现在拥有的:
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
.
\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
我正在开发一个简单的搜索工具。它在命令行参数定义的目录中搜索源代码文件,例如:
finder 'path' 'keyword'
我在如何正确地将给定参数转换为我可以在 Dir.chdir(path) 中使用的路径字符串时遇到困难。这就是我的意思,根据我的逻辑,我有 4 种不同的情况:
- 。 (只是当前目录)
- /文件夹
- ./文件夹
- ~/Desktop/folder
这是我现在拥有的:
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
.
\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