2013-02-13 3 views
2

두 문자열을 서로 비교해야합니다.와일드 카드로 문자열 비교

임의의 숫자를 대체 할 수있는 와일드 카드 문자 '%'(숫자는 임의의 크기 일 수 있음)가 있습니다.

string str1 = "STRUCT[1].VARSTRUCT[10].VAR[1]"; 
string str2 = "STRUCT[%].VARSTRUCT[%].VAR[%]"; 
string str3 = "STRUCT[%].VARSTRUCT[%].VAR[2]"; 

CompareStrings(str1, str2); // Should return TRUE; 
CompareStrings(str2, str3); // Should return TRUE; 
CompareStrings(str1, str3); // SHould return FALSE; 
+0

문자열 일치에 정규 표현식 사용 –

+1

이 문제에 최선을 다 했습니까? 너 뭐 했어? –

+1

그리고 귀하의 질문은 ...? – ken2k

답변

3

를 작동하면 대표 번호와 와일드 카드가 포함 된 두 개의 문자열을 위해 그것을 할 수있는 방법입니다 숫자 :

private static bool CompareStrings(string str1, string str2) 
    { 
     var ar1 = Regex.Matches(str1, @"[\d%]+").Cast<Match>().Select(m => m.Value).ToArray(); 
     var ar2 = Regex.Matches(str2, @"[\d%]+").Cast<Match>().Select(m => m.Value).ToArray(); 

     if (ar1.Length != ar2.Length) 
      return false; 

     // Check wildcards and numbers 
     for (int i = 0; i < ar1.Length; i++) 
      if (ar1[i] != ar2[i] && ar1[i] != "%" && ar2[i] != "%") 
       return false; 

     // Remove wildcards and numbers to check the other characters 
     if (Regex.Replace(str1, @"[\d%]+", String.Empty) != Regex.Replace(str2, @"[\d%]+", String.Empty)) 
      return false; 

     return true; 
    } 
2

그런 일 ... 작업을 수행하는 방법에 꽤 빠르고 약 작성 예를하지만 여기

class Program 
{ 
    static void Main(string[] args) 
    { 

     string str1 = "STRUCT[1].VARSTRUCT[10].VAR[1]"; 
     string str2 = "STRUCT[%].VARSTRUCT[%].VAR[%]"; 
     string str3 = "STRUCT[%].VARSTRUCT[%].VAR[2]"; 

     Console.WriteLine("str1 - str2: " + SpecialComparers.AreEqual(str1, str2)); 
     Console.WriteLine("str2 - str3: " + SpecialComparers.AreEqual(str2, str3)); 
     Console.WriteLine("str1 - str3: " + SpecialComparers.AreEqual(str1, str3)); 

    } 
} 

class SpecialComparers 
{ 
    public static bool AreEqual(String in1, String in2) 
    { 
     Regex re = new Regex(@"STRUCT\[(\d+|%)\]\.VARSTRUCT\[(\d+|%)\]\.VAR\[(\d+|%)\]"); 

     var values1 = re.Match(in1).Groups; 
     var values2 = re.Match(in2).Groups; 

     if (values1.Count != values2.Count) return false; 

     for (int i = 1; i <= values1.Count; i++) 
     { 
      if (!values1[i].ToString().Equals(values2[i].ToString()) 
       && !values1[i].ToString().Equals("%") 
       && !values2[i].ToString().Equals("%") 
      ) 
       return false; 
     } 
     return true; 
    } 
} 
+0

finetuning and fail-proofing definately possible and suggest – Ingo