2014-01-09 157 views
1

我有兩個字符串,它們都是某種參考號碼(有一個前綴和數字)。兩個字符串然後比較

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(),所以我不必擔心的情況下。但這種方法的問題是,如果我有很多特殊字符,我會做很多次,這不是理想的。

另一個問題是,R&D是不是我需要擔心的唯一的前綴,還有其他如A.P.K-D等不知道這是否會有所作爲:任何幫助表示讚賞/

,謝謝!

回答

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); 
+0

所以我在轉換字符串a和b成char []?並獲得只有字母和數字後,將其轉換回字符串?對不起,我知道var使得聲明變得簡單,但我想知道類型0.0 – sora0419

+0

是的,您正在刪除無效字符並將它們轉換爲char數組。然後再次將它們串起來,並使用ToLower使所有字符小寫 –

1

試試這個...

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

它將替換所有的特殊字符,並給你規範化字符串。

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