【问题标题】:Most-specific matching wild card path最具体的匹配通配符路径
【发布时间】:2011-10-31 23:57:43
【问题描述】:

给定一个类 Unix 路径的资源结构:

例如

/foo/bar/baz/phleem/abc.txt

还有一组蚂蚁风格的通配符模式:

*  matches zero or more characters excluding /
** matches zero or more full sub-paths (may not be preceded or followed
   by anything other than /)

模式中的所有其他字符都是文字,为了简单起见,只有字符

A-Z、a-z、0-9、/ 和 .

在路径中允许。

鉴于上述结构:

我是否正确假设在所有匹配模式中,最具体的匹配总是按字母顺序排列的最后一个?

例子:

路径:

/foo/bar/baz/phleem/abc.txt

匹配模式(按字母顺序):

**               < least specific
**/*.txt
**/phleem/*.txt
/foo/**/abc.txt  < most specific

更新:好的,这是我对“最具体”的定义

如果 a 比 b 更具体

  1. a 的非通配符前缀比 b 的长
  2. 给定两个通配符在相同的各自偏移量,* 比 ** 更具体

【问题讨论】:

  • 不清楚为什么你认为**/phleem/*.txt/foo/**/abc.txt 更“不具体”。在它们分别匹配的两组路径中,没有一个包含在另一个中。
  • @n.m.你说得对,我很快就会详细说明这一点。谢谢
  • 特异性不应该是通配符数量的函数吗?我可以同意 ** > * 但我认为您还应该包括 ** > 。非通配符前缀长度的条件似乎相当人为。为什么 /foo/bar/anything 比 foo/*/anything 更具体?
  • @tripleee 因为否则这个问题是无法解决的,我猜 :-) 不,这在我正在开发的应用程序中更有意义

标签: string language-agnostic path pattern-matching


【解决方案1】:

严格来说,您没有按字母顺序排列,因为 /* 不是字母,所以它是按字典顺序排列的。看来您已经假设 * [a-zA-Z0-9./] 这很重要。这样对模式进行排序将满足您的第一个条件,即非通配符前缀具有最大长度。但是,排序只会确保在第一个不相等的情况下使用* 而不是**;所有剩余的通配符都与排序无关。这可能是个问题。考虑以下两种模式:

/**/*.txt
/*/**

它们是有序的,但我认为第一个实际上更具体。

【讨论】:

  • 奇怪的是,人们使用“词典”来表示与 真正的词典编纂者在排序词典或电话簿条目时所使用的任何内容完全相反的排序。数字代码点顺序与正确的字母/字典/词典编纂者的顺序完全不同;实际上,这几乎是垃圾。
  • @Kevin 我严格按照 ASCII 字符集中的顺序来定义字母顺序。你是对的,你的特殊情况会打破我的假设,即使它不太可能发生。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多