- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我所说的模糊匹配并不是指通过 Levenshtein 距离或类似的东西来表示相似的字符串,而是它在 TextMate/Ido/Icicles 中的使用方式:给定一个字符串列表,找到包含搜索字符串中所有字符的字符串,但是可能与其他角色之间,更喜欢最合适的。
最佳答案
我终于明白你在找什么了。这个问题很有趣,但是看看你发现的 2 种算法,人们似乎对规范有很大不同的看法;)
我认为更清楚地说明问题和要求会很有用。
问题:
我们正在寻找一种加快输入速度的方法,方法是允许用户仅输入他们实际想要的关键字的几个字母,并向他们提供一个列表供他们选择。
分析:
前两个要求可以这样总结:对于输入axg
,我们正在寻找匹配这个正则表达式的单词[^a]*a[^x]*x[ ^g]*g.*
第三个要求是故意放宽的。单词在列表中出现的顺序需要保持一致……但是很难猜测评分方法是否比字母顺序更好。如果列表非常长,那么评分方法可能会更好,但是对于较短的列表,眼睛更容易在以明显方式排序的列表中寻找特定项目。
此外,字母顺序的优点是在输入过程中保持一致:即添加一个字母不会完全重新排序列表(对眼睛和大脑来说是痛苦的),它只是过滤掉不再匹配的项目。
没有关于处理 unicode 字符的精确度,例如 à
是否类似于 a
或完全是另一个字符?由于我知道目前没有语言在其关键字中使用此类字符,因此我暂时不说。
我的解决方案:
对于任何输入,我都会构建之前表达的正则表达式。它适用于 Python,因为该语言已经具有不区分大小写的匹配功能。
然后我会匹配我的(按字母顺序排列的)关键字列表,并将其过滤后输出。
在伪代码中:
WORDS = ['Bar', 'Foo', 'FooBar', 'Other']
def GetList(input, words = WORDS):
expr = ['[^' + i + ']*' + i for i in input]
return [w for w in words if re.match(expr, w, re.IGNORECASE)]
我本可以使用单行代码,但我认为它会使代码变得模糊 ;)
此解决方案非常适用于增量情况(即,当您匹配用户类型并因此不断重建时),因为当用户添加角色时,您可以简单地重新过滤刚刚计算的结果。因此:
我还应该注意到,这个正则表达式不涉及回溯,因此非常有效。它也可以建模为一个简单的状态机。
关于 "fuzzy matching"字符串的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2891514/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!