如何在c#中比较两个字符串并忽略特殊字符

时间:2013-12-06 10:21:38

标签: c# string

我想比较c#中的两个字符串,如果有一个特殊字符,那么它应该被忽略。如果 -

string a1= "he is a good guy";
string a2="h2$#%# is a good guy";

然后在string.ReferenceEquals(a1,a2)之后应该返回True?

我该怎么做?

3 个答案:

答案 0 :(得分:5)

首先,ReferenceEquals在这里并不好,因为它比较了引用,而不是值。因此,如果你比较两个不同的变量,你的代码总是假的(并且字符串不会被实习,但它是一个不同的故事)。

要比较字符串,请使用string.Equals方法。但首先,你必须摆脱特殊字符,在Regex的帮助下才有可能:

string a2 = "h2$#%# is a good guy";
string a3 = Regex.Replace(a1, @"[^\w\d\s]", "");

这表示您要替换不是(^)单词字符(\w),数字(\d)或空格(\s)的所有内容用空字符串。

使用它,您的解决方案应如下所示:

string.Equals(Regex.Replace(a1, @"[^\w\d\s]", ""), 
              Regex.Replace(a2, @"[^\w\d\s]", ""));

要不重复正则表达式代码,可以为字符串编写辅助扩展方法:

public static class StringExtensions
{
    public static string RemoveSpecialCharacters(this string str)
    {
        return Regex.Replace(str, @"[^\w\d\s]", "");
    }
}

,您的代码将是:

string.Equals(a1.RemoveSpecialCharacters(), 
              a2.RemoveSpecialCharacters());

答案 1 :(得分:0)

您可以使用正则表达式解决问题。关于这个主题的一些很好的资源可以在:

找到
  1. 官方msdn页面 - http://msdn.microsoft.com/de-de/library/system.text.regularexpressions.regex(v=vs.110).aspx
  2. Dotnetperls - http://www.dotnetperls.com/regex-match
  3. 理论中的一般语言独立正则表达式 - http://www.regular-expressions.info/dotnet.html
  4. 编辑:

    我不认为,ReferenceEquals是您正在寻找的官方msdn documentation州:

      

    确定指定的Object实例是否是同一个实例。

    您想要比较字符串的内容,请查看正则表达式。

答案 2 :(得分:0)

您可以定义自定义比较方法。

例如

private string[] patternsToIgnore = new []{"#","$","%","2$"}; //expand it as you like;

public static CustomCompare(this string s, string otherString){
   var v1 = s;
   var v2 = otherString;
   foreach (var p in patternsToIgnore){
      v1 = v1.Replace(p, String.Empty);
      v2 = v2.Replace(p, String.Empty);
   }
   return v1 == v2;
}

以下列方式使用它:

string a1= "he is a good guy";
string a2= "h2$#%#w is a good guy";

if (a1.CustomCompare(a2)){
  //you should now get here
}