【问题标题】:Compare two strings by ignoring certain characters通过忽略某些字符来比较两个字符串
【发布时间】:2009-01-31 01:36:22
【问题描述】:

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

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

例如:

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

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

谢谢!

【问题讨论】:

  • 如果您正在考虑诸如帐号之类的事情,我通常会对其进行清理(删除破折号、空格等)并传递数字。当呈现给用户时,可以重新格式化。
  • 比较字符串中不同组件之间的分隔符不同的字符串。示例:IP/Mac 地址、路径(尽管有解决方案)以及其他一般情况,人们在使用“^”或“|”等字符分隔组件时有自己的选择
  • 在这种情况下,正确的做法是删除非重要字符,正如您已经建议的那样。

标签: c# string


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    不确定这是否有帮助:

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

    “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]
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-03
            相关资源
            最近更新 更多