Вывести похожие строки, если в них есть одинаковые значения в цикле?

Имеется файл MyLinks.txt содержащий url адреса вида:

http://MyServer.tp/Program/323.23/323.23-dba-win10-64bit-demo-expired.zip
http://MyServer.tp/Program/323.23/323.23-dba-win10-64bit-original.zip
http://MyServer.tp/Program/361.40/361.40-dba-win10-64bit-demo-expired.zip
http://MyServer.tp/Program/230.33/230.33-dba-win10-64bit-original.zip
.....................................................................
http://MyServer.tp/Program/399.07/399.07-dba-win10-64bit-original.zip
http://MyServer.tp/Program/353.30/353.30-dba-win10-64bit-demo-expired.zip
http://MyServer.tp/Program/355.60/355.60-dba-win10-64bit-original.zip
http://MyServer.tp/Program/340.40/340.40-dba-win10-64bit-original.zip
.....................................................................

Далее я хочу показать только те адреса, которые содержат между собой 100% совпадение только в части пути значения версии (то есть тут: 353.62/353.62). Далее я делаю так:

foreach (string line in File.ReadAllLines(@"MyLinks.txt"))
            {
                if (Regex.IsMatch(line, @"\d{3}\.\d{2}", RegexOptions.IgnoreCase))
                {
                    Console.WriteLine(line);
                }
            }

Вроде бы все работает, и действительно отображаются строки как нужно, НО, вместе с этим показываются и куча таких к примеру строк:

http://MyServer.tp/Program/353.30/353.30-dba-win10-64bit-original.zip
http://MyServer.tp/Program/355.60/355.60-dba-win10-64bit-original.zip
http://MyServer.tp/Program/361.40/361.40-dba-win10-64bit-original.zip
http://MyServer.tp/Program/311.63/311.63-dba-win10-64bit-demo-expired.zip
http://MyServer.tp/Program/399.07/399.07-dba-win10-64bit-demo-expired.zip

А мне нужно всего навсего показывать строки у которых в пути одинаковые значения версии, и имеется на конце либо ...-demo-expired, либо ...-original, но я считаю, если будут одинаковые значения у строк, то и не нужно еще искать и по окончанию, я думаю это лишнее. А выводится должно вот так:

http://MyServer.tp/Program/323.23/323.23-dba--win10-64bit-demo-expired.zip
http://MyServer.tp/Program/323.23/323.23-dba--win10-64bit-original.zip
http://MyServer.tp/Program/320.20/320.20-dba--win10-64bit-demo-expired.zip
http://MyServer.tp/Program/320.20/320.20-dba--win10-64bit-original.zip
http://MyServer.tp/Program/280.80/280.80-dba--win10-64bit-demo-expired.zip
http://MyServer.tp/Program/280.80/280.80-dba--win10-64bit-original.zip
http://MyServer.tp/Program/160.60/160.60-dba--win10-64bit-demo-expired.zip
http://MyServer.tp/Program/160.60/160.60-dba--win10-64bit-original.zip
...................................................................

Я уже всю голову себе сломал, как это сделать и так пробовал:

if (Regex.IsMatch(line, @"([0-9]{3})+\./([0-9]{2})+"*, RegexOptions.IgnoreCase)
     {
        Console.WriteLine(line);
     }

И вот так:

if (Regex.IsMatch(line, @"([0-9]{3})+\./([0-9]{2})+"*, RegexOptions.IgnoreCase) && (Regex.IsMatch(line, @"demo-expired.*$", RegexOptions.IgnoreCase) || (Regex.IsMatch(line, @"original.*$", RegexOptions.IgnoreCase))))
         {
            Console.WriteLine(line);
         }

Но он все равно показывает лишние похожие только по паттерну строки, как правильно в таком случае должно выглядеть условие?


Ответы (0 шт):