如何删除MatchCollection中的重复匹配

ray*_*ran 11 c# regex duplicates match

在我的MatchCollection中,我获得相同的匹配.像这样:

string text = @"match match match";
Regex R = new Regex("match");
MatchCollection M = R.Matches(text);
Run Code Online (Sandbox Code Playgroud)

如何删除重复的匹配,是否是最快的方式?

假设此处的"重复"表示匹配包含完全相同的字符串.

Ωme*_*Man 15

如果您使用.Net 3.5及更高版本,则可以使用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
Run Code Online (Sandbox Code Playgroud)

更新

对于.Net 2及之前,将其放入hastable然后提取字符串:

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);
Run Code Online (Sandbox Code Playgroud)

  • 这是我更喜欢保持的习惯。`m.Value` 在大多数情况下是正确的(在处理正则表达式时),但必须明白 `[0]` 是整个匹配组,而 `[1]` ...`[n]` 是单独的子捕获*组内*。有时你可能有一个模式用于 `a(b)c`,其中 `m.Value` 和 `m.Groups[0].value` 是“abc”,但一个只需要“b”(因为它在匹配捕获中分组)一个使用`m.Groups[1].value`。 (2认同)