数字和特殊字符的正则表达式 - C#

时间:2016-12-22 16:24:17

标签: c# regex string

我使用Html-Agility-Pack从某些网站中提取信息。在此过程中,我以string的形式获取数据,并在程序中使用该数据。

有时,我获得的数据包含单个string中的多个详细信息。正如这部电影的名字" Dog Eats Dog(2012)(2012)" 。该名称应该是" Dog Eats Dog(2012)" 而不是第一个。

以上是许多人的一个例子。为了解决问题,我尝试使用string.Distinct()方法,但它会删除string中的所有重复字符,如上例所示,它会返回" Dog Eats(2012) " 即可。现在它通过删除第二个(2012)解决了我的初始问题,但通过更改实际标题创建了一个新问题。

我认为我的问题可以通过Regex来解决,但我不知道如何在这里使用它。据我所知,如果我使用Regex,它会告诉我string根据定义的Regex代码存在重复的项目。

但我如何删除它?可以有string喜欢" Meme 2013(2013)(2013)"。 现在实际的标题是" Meme 2013"与年份(2013年)和重复年份(2013年)。即使我得到bool值表明string有重复年份,我也无法想到任何方法来实际删除重复的substring

重复的年份总是在string的末尾。那么我应该使用Regex来确定该字符串实际上有两年,如(2012)(2012)?

如果我能够正确识别string包含重复内容,我可以使用string.LastIndexOf()尝试删除重复的部分。如果有更好的方法,请告诉我。

感谢。

2 个答案:

答案 0 :(得分:1)

正确的正则表达式为"( \(\d{4}\))\1+"

string pattern = @"( \(\d{4}\))\1+";
new Regex(pattern).Replace(s, "$1");

此处示例:https://repl.it/Evcy/2

说明:
捕获一个" (DDDD)"阻止,并删除所有以下相同的 ( \(\d{4}\))执行捕获,\1+找到捕获块的任何非空序列

最后,仅用初始块替换初始块及其副本。

答案 1 :(得分:0)

这个正则表达式允许任何空格模式,甚至没有,如(2013)(2013)

`@"(\(\d{4}\))(?:\s*\1)+"`

我有一个演示here