首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查字符串是否为glob模式

检查字符串是否为glob模式
EN

Stack Overflow用户
提问于 2017-02-16 19:30:28
回答 1查看 3.1K关注 0票数 1

在输入上,我有可以是普通路径字符串(例如/home/user/1.txt)或glob模式(例如/home/user/*.txt)的字符串。

接下来,如果字符串是glob模式,我希望得到匹配数组;如果字符串只是普通路径,我希望得到带有单个元素的数组--这个路径。

因此,我应该检查字符串是否包含未转义的glob符号,如果它确实包含,则调用Pathname.glob()获取匹配,否则只需返回该字符串的数组。

如何检查字符串是否是一个全局模式?

更新

我在实现支持zap节的自制木桶时遇到了这个问题。我使用的解决方案是进行一些重构,以避免需要检查字符串是否是一个glob模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-16 19:44:15

接下来,如果字符串是glob模式,我希望得到匹配数组;如果字符串只是普通路径,我希望得到带有单个元素的数组--这个路径。

它们都是有效的全球模式。一个包含通配符,一个不包含。通过Pathname.glob()运行它们,您将始终得到一个数组。奖金,它会检查它是否匹配任何东西。

代码语言:javascript
复制
$ 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*却战胜了这一点。

相反,检查它是否存在。

代码语言:javascript
复制
Pathname.new(path).exist?

如果它存在,那么它就是一个真正的文件路径。如果它不存在,它可能是一条真正的道路,也可能是一条地球。那可能就够好了。

您还可以通过查看Pathname.glob(path)是否返回与原始路径匹配的单个元素来进行检查。注意,当匹配路径时,使用cleanpath对双方进行规范化是很重要的。

代码语言:javascript
复制
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"
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42283009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档