Как удалить дубликаты совпадений в MatchCollection - PullRequest
11 голосов
/ 21 декабря 2011

В моей коллекции MatchCollection я получаю совпадения одного и того же.Как это:

string text = @"match match match";
Regex R = new Regex("match");
MatchCollection M = R.Matches(text);

Как удалить дубликаты совпадений и это самый быстрый способ?

Предположим, что «дубликат» здесь означает, что совпадение содержит точно такую ​​же строку.

Ответы [ 2 ]

15 голосов
/ 22 декабря 2011

Linq

Если вы используете .Net 3.5 или выше, например 4.7, linq можно использовать для удаления дубликатов совпадения.

string data = "abc match match abc";

Console.WriteLine(string.Join(", ", 

Regex.Matches(data, @"([^\s]+)")
     .OfType<Match>()
     .Select (m => m.Groups[0].Value)
     .Distinct()

));

// Outputs abc, match

.Net 2или Нет Linq

Поместите его в таблицу, затем извлеките строки:

string data = "abc match match abc";

MatchCollection mc = Regex.Matches(data, @"[^\s]+");

Hashtable hash = new Hashtable();

foreach (Match mt in mc)
{
    string foundMatch = mt.ToString();
    if (hash.Contains(foundMatch) == false)
        hash.Add(foundMatch, string.Empty);

}

// Outputs abc and match.
foreach (DictionaryEntry element in hash)
    Console.WriteLine (element.Key);
1 голос
/ 21 декабря 2011

Попробуйте

Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b", RegexOptions.Compiled);
string text = @"match match match";
MatchCollection matches = rx.Matches(text);
...