在输入上,我有可以是普通路径字符串(例如/home/user/1.txt)或glob模式(例如/home/user/*.txt)的字符串。
接下来,如果字符串是glob模式,我希望得到匹配数组;如果字符串只是普通路径,我希望得到带有单个元素的数组--这个路径。
因此,我应该检查字符串是否包含未转义的glob符号,如果它确实包含,则调用Pathname.glob()获取匹配,否则只需返回该字符串的数组。
如何检查字符串是否是一个全局模式?
更新
我在实现支持zap节的自制木桶时遇到了这个问题。我使用的解决方案是进行一些重构,以避免需要检查字符串是否是一个glob模式。
发布于 2017-02-16 19:44:15
接下来,如果字符串是glob模式,我希望得到匹配数组;如果字符串只是普通路径,我希望得到带有单个元素的数组--这个路径。
它们都是有效的全球模式。一个包含通配符,一个不包含。通过Pathname.glob()运行它们,您将始终得到一个数组。奖金,它会检查它是否匹配任何东西。
$ irb
2.3.3 :001 > require "pathname"
=> true
2.3.3 :002 > Pathname.glob("test.data")
=> [#<Pathname:test.data>]
2.3.3 :003 > Pathname.glob("test.*")
=> [#<Pathname:test.asm>, #<Pathname:test.c>, #<Pathname:test.cpp>, #<Pathname:test.csv>, #<Pathname:test.data>, #<Pathname:test.dSYM>, #<Pathname:test.html>, #<Pathname:test.out>, #<Pathname:test.php>, #<Pathname:test.pl>, #<Pathname:test.py>, #<Pathname:test.rb>, #<Pathname:test.s>, #<Pathname:test.sh>]
2.3.3 :004 > Pathname.glob("doesnotexist")
=> []这是一种早期规范化和验证数据的好方法,因此程序的其他部分不必这么做。
如果您真的想知道某物是文字路径还是字汇,您可以尝试扫描任何特殊的字词字符,但这会很快变得复杂和容易出错。它需要作品细部,并记住检查引用和转义。foo*有一个全球模式。foo\*没有。foo[123]有。foo\[123]没有。我不知道foo[123\]在做什么,我认为它是一个没有终止的集合.
通常,您希望避免编写必须再现另一段代码的内部工作的代码。如果有一个Pathname.has_glob_chars,您可以使用它,但是没有这样的东西。
Pathname.glob使用File.fnmatch来执行全局操作,您可以在不接触文件系统的情况下使用它。你也许能用它想出一些东西,但我不能让它发挥作用。我想,也许只有文字路径才能匹配自己,但foo*却战胜了这一点。
相反,检查它是否存在。
Pathname.new(path).exist?如果它存在,那么它就是一个真正的文件路径。如果它不存在,它可能是一条真正的道路,也可能是一条地球。那可能就够好了。
您还可以通过查看Pathname.glob(path)是否返回与原始路径匹配的单个元素来进行检查。注意,当匹配路径时,使用cleanpath对双方进行规范化是很重要的。
paths = Pathname.glob(path)
if paths.size == 1 && paths[0].cleanpath == Pathname.new(path).cleanpath
puts "#{path} is a literal path"
elsif paths.size == 0
puts "#{path} matched nothing"
else
puts "#{path} was a glob"
endhttps://stackoverflow.com/questions/42283009
复制相似问题