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);
}
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. –
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
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