Как извлечь определенный сегмент URL с помощью Regex & C # - PullRequest
1 голос
/ 08 апреля 2019

У меня есть URL-адреса такого типа:

/ домен.com / сегмент1 / сегмент2 / сегмент3 / сегмент4 / сегмент5 / сегмент6 / сегмент7 / имя файла.ext

Иногда

http://someother.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext

Мне нужно извлечь сегмент 6 специально с помощью C # и Regex.Regex является абсолютным требованием, так как в будущем я мог бы извлечь сегмент 3, просто изменив некоторые настройки.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

.NET имеет класс UriTemplate (Эми уже упоминала Uri в комментариях). Существует множество аспектов сопоставления URL-адресов (например, чувствительность к регистру, наклонная черта в талинге, отсутствие косой черты и т. Д.), Которые могут сделать задачу нахождением подходящего регулярного выражения слишком сложной.

UriTemplate может иметь дело со многими из этих вещей "из коробки". Может быть, вы можете использовать это для подхода «разделяй и властвуй».

Uri baseUri = new Uri("http://someother.com");
UriTemplate template 
    = new UriTemplate("segment1}/{segment2}/{segment3}/{segment4}/{segment5}/{segment6}/{segment7}/{filename}");
Uri fullUri 
    = new Uri("http://someother.com/super1/kali2/fragi3/listig4/expi5/ali6/docious7/filename.ext");

UriTemplateMatch results = template.Match(baseUri, fullUri);

if(results.BoundVariables["segment6"]) {
    WriteLine(results.BoundVariables["segment6"]);
    // Output: "ali6"
    // further regex matching can take place here
}

Более подробную информацию можно найти в справочной документации .NET .

1 голос
/ 08 апреля 2019

Хотя лучше использовать классы, связанные с URL, для анализа URL, как объяснено в другом ответе, поскольку встроенные функции проверены и хорошо протестированы для обработки даже угловых случаев, но, как вы упомянули, у вас есть некоторые ограничения и вы можете использовать только regex solution, вы можете попробовать следующее решение.

С помощью этого регулярного выражения можно легко найти шестой или N-й сегмент,

(?:([^/]+)/){7}

, который захватывает 6 + 1 (N + 1 в целом для N-го сегмента, где +1 - для соответствующей доменной части URL-адреса), а группа сохраняет последнее захваченное значение, к которому можно получить доступ с помощью group1.

Здесь ([^/]+) соответствует одному или нескольким любым символам, кроме /, и захватывает содержимое в group1, за которым следует /, и все это соответствует ровно 7 раз.

Regex Demo

C # код демо

var pattern = "(?:([^/]+)/){7}";
var match = Regex.Match("/domain.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext", pattern);
Console.WriteLine("Segment: " + match.Groups[1].Value);
match = Regex.Match("http://someother.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext", pattern);
Console.WriteLine("Segment: " + match.Groups[1].Value);

Печатает значение шестого сегмента,

Segment: segment6
Segment: segment6
1 голос
/ 08 апреля 2019

Попробуйте Regex: (?<=\.com)(?:\/([^\/]+))+\/[^\/.]+?\.\w+

Regex Demo

C # Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...