1

我正在用 C# 编写一个程序,它比较字符串的方式类似于 Google 在文档中搜索关键字的方式。

我想要搜索“堆栈溢出”来为“堆栈溢出”(普通)返回 true,“这是堆栈溢出”。(中间),“欢迎来到 Stack Overflow。” (不区分大小写),“我喜欢堆栈溢出。” (可变空格)和“谁在堆栈溢出中添加破折号?”,但不是“堆栈溢出”(没有空格)。

我在想我可以使用像“stack([ -]|. )+overflow”这样的正则表达式,必须用每个新关键字的字符集替换每个关键字中的每个空格似乎有点过头了。因为“堆栈溢出”不是我要搜索的唯一字符串,所以我必须务实地进行。

4

3 回答 3

1

如果您只是想在您提到的特定情况下达到效果,您可以使用正则表达式将您要忽略的标记替换为单个空格(或空字符串)。

如果您想要更精细的解决方案,您可以使用动态编程来获得将第一个字符串转换为第二个字符串所需的最小排列。这也将允许匹配(很少)丢失的字母或拼写错误。

于 2010-09-30T00:23:04.583 回答
1

为了满足您的规格,您可以先做

newSearchString = Regex.Replace(Regex.Escape(searchString), @"\s+", @"[\s\p{P}]+");

(将您的纯文本搜索字符串转换为一个正则表达式,该表达式还允许在过去只有空格的地方使用标点符号),然后将该正则表达式应用于您正在搜索的任何文本。

但当然,这将无法匹配最轻微的拼写错误,而使用 Leventhein 距离的算法也将匹配“Stak Overfloor”。

于 2010-09-30T06:49:37.547 回答
0

如果您要与字符串进行比较,那么我能看到的最简单的方法是从两个字符串中去掉所有空格和其他字符,然后做一个简单的string.Contains.

于 2010-09-30T00:52:00.983 回答