我想比较c#中的两个字符串,如果有一个特殊字符,那么它应该被忽略。如果 -
string a1= "he is a good guy";
string a2="h2$#%# is a good guy";
然后在string.ReferenceEquals(a1,a2)
之后应该返回True?
我该怎么做?
答案 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)
您可以使用正则表达式解决问题。关于这个主题的一些很好的资源可以在:
找到编辑:
我不认为,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
}