命名两个字符串然后进行比较

问题描述 投票:1回答:3

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

string a = "R&D123";
string b = "R&D 123";

string astring 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等。不知道这样做是否会有区别。

任何帮助都是感激的,谢谢

c# string compare normalization
3个回答
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);

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

1
投票

试试这个...

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

它将替换所有的特殊字符并给你一个正常化的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.