C# 对两个字符串进行规范化,然后进行比较

C# 对两个字符串进行规范化,然后进行比较,c#,string,compare,normalization,C#,String,Compare,Normalization,我有两个字符串,它们都是某种参考号(有前缀和数字) 字符串a和字符串b是两种不同的用户输入,我试图比较这两个字符串是否匹配 我知道我可以使用String.Compare()来检查两个字符串是否相同,但就像上面的示例一样,它们可能是不同的字符串,但在技术上是相同的 因为它们都是用户输入(来自不同的用户),所以可以有几种不同的格式 "R&D123" "R&D 123" //with space in between "R.D.123 " //using period or other

我有两个字符串,它们都是某种参考号(有前缀和数字)

字符串a
字符串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
,等等。不确定这是否会产生影响:/


感谢您的帮助,谢谢

如果只需要字母和数字,可以使用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);

如果只需要字母和数字,可以使用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);
试试这个

string s2 = Regex.Replace(s, @"[^[a-zA-Z0-9]]+", String.Empty);
它将替换所有特殊字符并为您提供规范化字符串。

试试这个

string s2 = Regex.Replace(s, @"[^[a-zA-Z0-9]]+", String.Empty);

它将替换所有特殊字符,并为您提供规范化字符串。

这可能不是最漂亮的方法,但却是最快的方法

   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();
    }

这可能不是最漂亮的方式,但却是最快的

   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();
    }

那么,我是否要将字符串a和b转换为字符[]?在只得到字母和数字后,将其转换回字符串?抱歉,我知道var使声明变得容易,但我想知道类型0.0是的,您正在删除无效字符并将其转换为字符数组。然后再次将它们设置为字符串,并使用ToLowers将所有字符设置为小写。我是否要将字符串a和b转换为字符[]?在只得到字母和数字后,将其转换回字符串?抱歉,我知道var使声明变得容易,但我想知道类型0.0是的,您正在删除无效字符并将其转换为字符数组。然后再次将它们设置为字符串,并使用ToLower将所有字符设置为小写