我在一些文本数据上使用简单的正则表达式。表达似乎工作正常。我现在需要解决的问题是,每个匹配只返回一个结果,如下面所需的匹配所示。当然,数据会比这大得多。
示例数据:
stuffbefore233/stuffafter
stuffbefore233/stuffafter
stuffbefore111/stuffafter
stuffbefore111/stuffafter
正则表达式:
(?<=stuffbefore)[\d]+(?=/stuffafter)
目前的比赛:
233
,233
,111
,111
所需的比赛:
233
,111
我希望这是有道理的。如果您需要更多信息,请与我们联系。
答案 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)