忽略某些字符比较两个字符串

4
我想知道是否有一种简单的方法来检查两个字符串是否匹配,但排除字符串中的某些字符。请看下面的例子。
我可以通过编写正则表达式来查找“通配符”字符并将其替换为普通字符来轻松编写此类方法。然后比较两个字符串str1和str2。我不是在寻找这样的实现,而是想知道是否有任何 .Net 框架类可以解决这个问题。似乎是一个常见的需求,但我找不到任何这样的方法。
例如:
string str1 = "ABC-EFG";    
string str2 = "ABC*EFG";

两个字符串必须被声明为相等。
谢谢!

1
如果您想到像帐户号码这样的事情,我通常会对它们进行清理(删除破折号、空格等)并传递该数字。当呈现给用户时,可以重新格式化。 - Michael Haren
比较字符串时,如果字符串中不同组件之间的分隔符不同,则需要特殊处理。例如:IP/Mac地址、路径(虽然有解决方案),以及其他一般情况下人们可以使用"^"或"|"等字符来分隔组件的个人选择。 - Mystic
在这种情况下正确的做法是去除非重要字符,就像你已经建议的那样。 - Sean Bright
5个回答

10

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

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

4

不确定这是否有所帮助:

Damerau-Levenshtein距离是处理模糊字符串搜索的多种算法之一。

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

当然,该算法也会针对字符串"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]

1

抱歉,但我认为正则表达式或将“通配符”字符替换为普通字符是您最好的解决方案。基本上,这些答案都不是您想要得到的。


1

当然,您可以测试正则表达式而不进行替换:

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

看起来正则表达式是一个常见的用法,那么为什么要避免使用呢?


0
没有,框架本身没有任何可以做到这一点的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接