按特异性对通配符匹配项进行排序

本文关键字:排序 特异性 通配符 | 更新日期: 2023-09-27 18:36:55

给定一个字符串列表,如下所示:

a/b/*/lol/cats
*/*
foo/bar/**
foo/bar/*/C/**

您将如何按特异性对它们进行排序?

我的

天真方法(适用于我的大多数测试用例)如下:

var sorted = wildCards
    .OrderBy(c => c.HasCatchAll)
    .ThenBy(c => c.NumWildCards)
    .ThenByDescending(c => c.Pattern.Length);

在上面的代码中,HasCatchAll 属性指示字符串末尾有一个 **(** 的唯一有效位置)。

我对上述推理是,任何有**的东西都不比没有通配符的通配符具体,而且你拥有的通配符越多,你的具体性就越低。也就是说,上述内容将失败:

*/hi/*/*
*/*/hi/*

任何帮助将不胜感激。

按特异性对通配符匹配项进行排序

假设您有一个比较函数,那么为您的列表构建排序算法很容易。

问题是如何定义这样的函数。也许你可以这样定义它:

  • 两个字符串作为输入 (a, b)
  • 如果两个字符串相互匹配 => a == b
  • 如果两个字符串彼此不匹配=>更精细的比较,比如你的 HasCatch 东西......
  • 如果第一个字符串与第二个字符串匹配 => a
  • 如果第二个字符串与第一个字符串匹配 => a> b

例如,匹配是:*foo。在这里*匹配foo,但不是相反。

使用它,您可以覆盖案例

*/hi/*/*
*/*/hi/*

这将表示它们彼此匹配,这意味着它们具有相同的顺序。

长话短说:我不认为你的解决方案失败了。将这两个字符串定义为"相等"是有意义的,不是吗?

第二个想法:如果你在这样的字符串中优先考虑你的条目:1/2/3/4...你也可以规避你的问题..在这种情况下*/hi/*/*更具体