如何查看一个字符串是否松散地包含另一个字符串(大小写,额外的空格和标点符号被忽略)?

时间:2010-09-30 00:18:16

标签: c# regex string-comparison

我正在用C#编写一个程序来比较字符串,就像Google搜索文档中的关键字一样。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

为了符合您的规范,您可以先做

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

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

但是当然这在最轻微的错字上是无法匹配的,而使用Levensthein距离的算法也会匹配“Stak Overfloor”。

答案 2 :(得分:0)

如果您要与字符串进行比较,那么我能看到的最简单的方法是从两个字符串中删除所有空格和其他字符并执行简单的{{1} }。