我是.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” -
blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablablab345bblablab主要储存:C61
C62:1215
C61:1785blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345blablablabla12345
到目前为止一切顺利。我的问题是 - 如何制作它以便仅捕获特定的匹配ONCE?所以在上面的例子中,我希望最终吐出“C61,C62”而不是“C61,C62,C61”。 RegEx是否可以使用RegEx,或者在RegEx完成捕获后我应该操作列表吗?无论哪种方式,我将如何处理它?</ p>
提前感谢您提供的任何帮助。
答案 0 :(得分:3)
@Nefarrii回答了如何从列表中删除重复项,这绝对应该在这里完成!它更快,更容易,更便宜,更好。
如果你想知道,我会为Regex部分做出贡献 - 是的,可以做到。
您已经捕获了每个令牌,因此您只需使用lookahead来检查“它是否后跟相同的文字”(使用backreference)。
<强>正则表达式:强>
(?: : (?<portion>[A-Z]{1,2}[0-9]{2})|^\s*(?<portion>[A-Z]{1,2}[0-9]{2}) :)(?!.*(?: : \k<portion>|^\s*\k<portion> :))
^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(same group, with a name) (negative lookahead: it's not followed by the text captured in group <portion>)
RegexOptions.Singleline | RegexOptions.Multiline
的代码:强>
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 );
}
答案 1 :(得分:2)