正则表达式:如何限制每个匹配一个结果

时间:2010-10-29 21:38:35

标签: c# regex

我在一些文本数据上使用简单的正则表达式。表达似乎工作正常。我现在需要解决的问题是,每个匹配只返回一个结果,如下面所需的匹配所示。当然,数据会比这大得多。

示例数据:

stuffbefore233/stuffafter
stuffbefore233/stuffafter
stuffbefore111/stuffafter
stuffbefore111/stuffafter

正则表达式:

(?<=stuffbefore)[\d]+(?=/stuffafter)

目前的比赛: 233233111111

所需的比赛: 233111

我希望这是有道理的。如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

首先,过滤结果以删除重复项应该非常简单。例如:

MatchCollection matches = Regex.Matches(s, @"(?<=stuffbefore)\d+(?=/stuffafter)");
IEnumerable<string> a = matches.Cast<Match>().Select(m => m.Value).Distinct();

如果你坚持使用正则表达式来解决它(我怀疑它的性能和维护性能较差),你可以使用另一个预先检查数字是否会再次重复。在这里,我在数字周围添加了一个捕获组,因此我可以使用反向引用(\1)。这会找到每个数字的 last 匹配(因为将前瞻与后引用结合起来更容易):

(?<=stuffbefore)(\d+)(?=/stuffafter)(?!.*stuffbefore\1/stuffafter)