Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从列表中删除重复捕获_C#_Regex_.net 4.6 - Fatal编程技术网

C# 从列表中删除重复捕获

C# 从列表中删除重复捕获,c#,regex,.net-4.6,C#,Regex,.net 4.6,我是.NET新手,对RegEx不是很在行,但我有以下代码- var p = GetAllMatches(lines, @"^\s+?([A-Z]{1,2}[0-9]{2}) : |: ([A-Z]{1,2}[0-9]{2})") .SelectMany(m => m.Groups[1].Captures.Cast<Capture>().Select(c => c.Value).ToList())

我是.NET新手,对RegEx不是很在行,但我有以下代码-

    var p = GetAllMatches(lines, @"^\s+?([A-Z]{1,2}[0-9]{2}) : |: ([A-Z]{1,2}[0-9]{2})")
                        .SelectMany(m => m.Groups[1].Captures.Cast<Capture>().Select(c => c.Value).ToList())
                        .ToList();


    private static List<Match> GetAllMatches(List<string> lines, string pattern, RegexOptions options=RegexOptions.None)
    {
        return lines
            .Select(l => Regex.Match(l, pattern, options))
            .Where(m => m.Success)
            .ToList(); 
    }
…我认为,它捕获字符串中以:开头并后跟1或2个字母字符和2个数字的部分,或字符串中以:结尾并后跟1或2个字母字符和2个数字的部分

例如,它应该在下面的文本块中捕获C61、C62、C61-

blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345

主存:C61 C62:1215 C61:1785

blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blablabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345blabla12345

到目前为止还不错。我的问题是-如何使它只捕获一次特定的匹配?在上面的例子中,我希望它最终吐出C61,C62,而不是C61,C62,C61。这在正则表达式中是可能的,还是我应该在正则表达式完成捕获后操作列表?不管怎样,我会怎么做

提前感谢您提供的任何帮助。

尝试使用

list.Distinct().ToList();
试用

list.Distinct().ToList();

@Nefarrii回答了如何从列表中删除重复项,这绝对是这里应该做的!它更快、更容易、更便宜、更好

如果你想知道的话,我会为正则表达式部分做贡献-是的,可以做到

您已经捕获了每个令牌,所以您所需要做的就是使用来检查它后面是否没有使用相同的文本

正则表达式:


@Nefarrii回答了如何从列表中删除重复项,这绝对是这里应该做的!它更快、更容易、更便宜、更好

如果你想知道的话,我会为正则表达式部分做贡献-是的,可以做到

您已经捕获了每个令牌,所以您所需要做的就是使用来检查它后面是否没有使用相同的文本

正则表达式:


谢谢你的回答。我想这比我原来想的要简单得多。谢谢你的回答。我想这比我原来想象的要简单得多。很好,我不知道那是可能的!打开了一个全新的可能性领域!谢谢你给我看这个。很好,我不知道那样做是可能的!打开了一个全新的可能性领域!谢谢你给我看这个。
string input = "blablablabla12345b\nMain Storage : C61\nC62 : 1215\nC61 : 1785\nblablablabla12345blablablabla";

string pattern = @"(?: : (?<portion>[A-Z]{1,2}[0-9]{2})|^\s*(?<portion>[A-Z]{1,2}[0-9]{2}) :)(?!.*(?: : \k<portion>|^\s*\k<portion> :))";
MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.Singleline | RegexOptions.Multiline);

foreach (Match match in matches)
{
     GroupCollection groups = match.Groups;
     Console.WriteLine( groups["portion"].Value );
}