Как извлечь определенный сегмент URL с помощью Regex и C#

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

/domain.com/segment1/segment2/segment3/segment4/segment5/segment6/segment7/filename.ext

Иногда

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

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

что ты уже испробовал?

Matt.G 08.04.2019 20:04

В .Net есть класс Uri, разработанный специально для разбора URI. Регулярные выражения не кажутся мне подходящим инструментом для этой работы.

user47589 08.04.2019 20:06

«Регулярное выражение является абсолютным требованием, так как я мог бы захотеть извлечь сегмент 3 в будущем, просто изменив некоторую конфигурацию». Я бы сказал, что вы можете сделать это практически с любым методом извлечения (например, string.Split)

user1781290 08.04.2019 20:10

Или, если вам нужно решение C#, если это так: dotnetfiddle.net/tSWDO6. Также обратите внимание, что вы можете поместить регулярное выражение в свою конфигурацию в соответствии с вашими потребностями.

Rahul Sharma 08.04.2019 20:21
new Uri(...).LocalPath.Split('/')[6] намного надежнее, чем Regex.
Dour High Arch 08.04.2019 20:22

Мое требование было С# + Regex. Regex было абсолютным требованием. Uri будет работать в фиксированном контексте. Я не в таком контексте.

Metrics 12.04.2019 17:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
1 295
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте регулярное выражение: (?<=\.com)(?:/([^/]+))+/[^/.]+?\.\w+

Демонстрация регулярных выражений

Демонстрация С#

В .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 для получения дополнительной информации.

Ответ принят как подходящий

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

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

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

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

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

Демонстрация регулярных выражений

Демонстрация кода 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

Спасибо. Вот оно. Я не мог использовать класс Uri. Вот почему я указал, что Regex является абсолютным требованием.

Metrics 12.04.2019 17:57

Другие вопросы по теме