gpt4 book ai didi

c# - 如何让正则表达式匹配只添加一次到匹配集合中?

转载 作者:可可西里 更新时间:2023-11-01 07:53:02 24 4
gpt4 key购买 nike

我有一个字符串,其中有几个 html 注释。我需要计算表达式的唯一匹配项。

例如,字符串可能是:

var teststring = "<!--X1-->Hi<!--X1-->there<!--X2-->";

我目前使用它来获取匹配项:

var regex = new Regex("<!--X.-->");
var matches = regex.Matches(teststring);

这是 3 场比赛的结果。但是,我希望只有 2 个匹配项,因为只有两个唯一匹配项。

我知道我可能可以遍历生成的 MatchCollection 并删除额外的 Match,但我希望有一个更优雅的解决方案。

澄清:示例字符串大大简化了实际使用的内容。 X8 或 X9 很容易出现,字符串中可能每个都有几十个。

最佳答案

我只会使用 Enumerable.Distinct Method例如像这样:

string subjectString = "<!--X1-->Hi<!--X1-->there<!--X2--><!--X1-->Hi<!--X1-->there<!--X2-->";
var regex = new Regex(@"<!--X\d-->");
var matches = regex.Matches(subjectString);
var uniqueMatches = matches
.OfType<Match>()
.Select(m => m.Value)
.Distinct();

uniqueMatches.ToList().ForEach(Console.WriteLine);

输出这个:

<!--X1-->  
<!--X2-->

对于正则表达式,你可以使用这个吗?

(<!--X\d-->)(?!.*\1.*)

似乎至少可以在 RegexBuddy 中处理您的测试字符串 =)

// (<!--X\d-->)(?!.*\1.*)
//
// Options: dot matches newline
//
// Match the regular expression below and capture its match into backreference number 1 «(<!--X\d-->)»
// Match the characters “<!--X” literally «<!--X»
// Match a single digit 0..9 «\d»
// Match the characters “-->” literally «-->»
// Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!.*\1.*)»
// Match any single character «.*»
// Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
// Match the same text as most recently matched by capturing group number 1 «\1»
// Match any single character «.*»
// Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»

关于c# - 如何让正则表达式匹配只添加一次到匹配集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/666241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com