我有两个字符串,它们都是某种参考号(有前缀和数字)。
string a = "R&D123";
string b = "R&D 123";
string a
和string b
是两个不同的用户输入,我正在尝试比较这两个字符串是否匹配。
我知道我可以使用String.Compare()
来检查两个字符串是否相同,但就像上面的例子中一样,它们可能是不同的字符串但在技术上是相同的。
因为它们都是用户输入(来自不同的用户),所以可以有几种不同的格式。
"R&D123"
"R&D 123" //with space in between
"R.D.123 " //using period or other character
"r&d123" //different case
"RD123" //no special character
...etc
有没有办法可以以某种方式“正常化”两个字符串然后比较它们?
我知道一种易于理解的方法是使用string.Replace()
将特殊字符和空格替换为空格并使用string.ToLower()
,这样我就不必担心案例了。但是这个方法的问题在于,如果我有很多特殊字符,我会做.Replace()
很多次,这并不理想。
另一个问题是,R&D
不是我需要担心的唯一前缀,还有其他内容,例如A.P.
,K-D
等。不确定这是否会产生影响:/
感谢任何帮助,谢谢!
答案 0 :(得分:3)
如果您只想要字母和数字,可以使用linq:
var array1 = a.Where(x =>char.IsLetterOrDigit(x)).ToArray();
var array2 = b.Where(x => char.IsLetterOrDigit(x)).ToArray();
var normalizedStr1 = new String(array1).ToLower();
var normalizedStr2 = new String(array2).ToLower();
String.Compare(normalizedStr1,normalizedStr2);
答案 1 :(得分:3)
这可能不是最漂亮的方式,但它是最快的
static void Main(string[] args)
{
string sampleResult = NormlizeAlphaNumeric("Hello wordl 3242348&&))&)*^&#R&#&R#)R#@)R#@R#R#@");
}
public static string NormlizeAlphaNumeric(string someValue)
{
var sb = new StringBuilder(someValue.Length);
foreach (var ch in someValue)
{
if(char.IsLetterOrDigit(ch))
{
sb.Append(ch);
}
}
return sb.ToString().ToLower();
}
答案 2 :(得分:1)
试试这个......
string s2 = Regex.Replace(s, @"[^[a-zA-Z0-9]]+", String.Empty);
它将替换所有特殊字符,并为您提供规范化字符串。