2013-06-08 15 views
6

używam dwa ciągi dla programu dopasowującego tak:Porównaj dwa ciągi przy użyciu regex

string s1= 5-4-6-+1-+1+1+3000+12+21-+1-+1-+1-+2-3-4-5-+1-+10+1-+1-+; 
string s2= 6-+1-+1+1+3000+12+21-+1-+1-+1-+1-+1-+1+1-+1-+; 

i mam zamiar napisać funkcję dopasowania Regex który porównuje każdy łańcuch część między sobą „+” osobno i oblicza procent dopasowania, czyli liczba dopasowań występujących w każdym ciągu. Na przykład, w tym przykładzie mają następujące wyniki:

6 

1 

1 

1 

3000 

12 

21 

1 

1 

1 

-- 

1 

-- 

1 

1 

W tym przypadku procent Match 13 * 100/15 = 87%.

Obecnie używam poniższej funkcji, ale myślę, że nie jest ona zoptymalizowana i użycie Regex może być szybsze.

public double MatchPercent(string s1, string s2) { 
    int percent=0; 
    User = s1.Split('+').ToArray(); 
    Policy = s2.Split('+').ToArray(); 

    for (int i = 0; i < s1.Length - 2; i++) { 
     int[] U = User[i].Split('-').Where(a => a != "").Select(n => 
         Convert.ToInt32(n)).Distinct().ToArray(); 
     int[] P = Policy[i].Split('-').Where(a => a != "").Select(n => 
         Convert.ToInt32(n)).Distinct().ToArray(); 
     var Co = U.Intersect(P); 
     if (Co.Count() > 0) { 
      percent += 1; 
     } 
    } 
    return Math.Round((percent) * 100/s1.Length); 
} 
+1

Nie rozumiem, co chcesz zrobić. W pętli for nie używasz wartości iteratora. Więc zawsze powinieneś otrzymać 98% meczu lub 0% meczu. –

+6

Nie sądzę, że będą działać wyrażenia regularne. W szczególności, nie sądzę, że można utrzymać stan (to znaczy liczbę identyczności) w ten sposób w regex. Obliczenie tego po meczu wymagałoby zmiennej liczby grup przechwytywania. – jpaugh

+0

Ta funkcja najpierw dzieli dwa ciągi oddzielone "+" i znajduje numery odpowiedników w każdej części. @KirillBestemyanov Ponownie zredagowałem funkcję, to był mój błąd w pisaniu. – Kamran

Odpowiedz