通过忽略某些字符来比较两个字符串

时间:2009-01-31 01:36:22

标签: c# string

我想知道是否有一种简单的方法可以通过排除字符串中的某些字符来检查两个字符串是否匹配。见下面的例子。

我可以通过编写正则表达式来查找“通配符”字符,并用常用字符替换它们,从而轻松编写这样的方法。然后比较两个字符串str1和str2。我不是在寻找这样的实现,而是想知道是否有任何.Net框架类可以解决这个问题。似乎是一种常见的需求,但我找不到任何这样的方法。

例如:

string str1 = "ABC-EFG";    
string str2 = "ABC*EFG";

必须声明两个字符串相等。

谢谢!

5 个答案:

答案 0 :(得分:8)

我发现自己有相同的要求,我使用的解决方案基于String.Compare方法:

String.Compare(str1, str2, CultureInfo.InvariantCulture, CompareOptions.IgnoreSymbols)

答案 1 :(得分:4)

不确定这是否有帮助:

The Damerau-Levenshtein distance是处理fuzzy string searching的几种算法之一。

“ABC-EFG”和“ABC * EFG”之间的DLD是1-“将一个字符串转换为另一个字符串所需的最小操作数,其中操作被定义为a的插入,删除或替换单个字符,或两个字符的转置。“

当然这个算法也会为两个字符串“ZBC-EFG”和“ABC-EFG”返回1 - 可能不是你想要的。

Python中的DLD实现,来自http://paxe.googlecode.com/svn/trunk/paxe/Lib/Installer.py

def dist(s1, s2):
    d = {}
    lenstr1 = len(s1)
    lenstr2 = len(s2)
    for i in xrange(-1,lenstr1+1):
        d[(i,-1)] = i+1
    for j in xrange(-1,lenstr2+1):
        d[(-1,j)] = j+1

    for i in xrange(0,lenstr1):
        for j in xrange(0,lenstr2):
            if s1[i] == s2[j]:
                cost = 0
            else:
                cost = 1
            d[(i,j)] = min(
                d[(i-1,j)] + 1, # deletion
                d[(i,j-1)] + 1, # insertion
                d[(i-1,j-1)] + cost, # substitution
                )
            if i>1 and j>1 and s1[i]==s2[j-1] and s1[i-1] == s2[j]:
                d[(i,j)] = min (d[(i,j)], d[i-2,j-2] + cost) # transposition

    return d[lenstr1-1,lenstr2-1]

答案 2 :(得分:1)

很抱歉,但我认为正则表达式或用通用字符替换“通配符”字符将是您最好的解决方案。基本上,你说的答案不想收到。

答案 3 :(得分:1)

您当然可以测试正则表达式替换:

[a-zA-z]{3}.[a-zA-z]{3}

似乎是正则表达式的常见用法,为什么要避免?

答案 4 :(得分:0)

不,框架本身没有任何东西可以做到这一点。