Regex для сопоставления шаблона маршрута с путем запроса - PullRequest
1 голос
/ 08 апреля 2020

Мне нужно построить регулярное выражение в C# для сопоставления с этими примерами пар URL ниже.

// Ex 01
// Route Template :      "/path/{id}/path2"
// Actual Request Path : "/path/1512312/path2"
// expected result = [match]

// Ex 02
// Route Template :      "/{name}/path/path2"
// Actual Request Path : "/damon/path/path2"
// expected result = [match]

// Ex 03
// Route Template :      "/path/{name}/{id}/path2"
// Actual Request Path : "/path/damon/1512312/path2"
// expected result = [match]

// Ex 04
// Route Template :      "/path/{name}/{id}/path2"
// Actual Request Path : "/path/damon/path2"
// expected result = [doesn't match!!!]

Я пытался использовать это регулярное выражение, но оно не работает в нескольких случаях, таких как Пример 03 выше.

var regex = new Regex("\\{.*?\\}");
string replacedRouteTemplate = regex.Replace("/path/{name}/{id}/path2", ".");

// this result below becomes false... when matching the Ex 03 example.
bool result = Regex.IsMatch(replacedRouteTemplate , "/path/damon/1512312/path2"); 

// Single occurrence works fine. the IsMatch returns "true" this time.
replacedRouteTemplate = regex.Replace("/path/{id}/path2", ".");
result = Regex.IsMatch(replacedRouteTemplate, "/path/1512312/path2");

Это простой вопрос.

Я хочу, чтобы мое регулярное выражение могло соответствовать нескольким вхождениям. Какие шаблоны мне нужно добавить туда?

1 Ответ

1 голос
/ 09 апреля 2020

Пожалуйста, проверьте ваш код дважды, особенно способ Regex.IsMatch - входная строка должна go на первом месте, тогда как шаблон является вторым аргументом.

Чтобы соответствовать всем символам, строка замены должна быть изменена с . по крайней мере .+. Я бы фактически предложил сузить его до [^/]+ (см. demo ):

var regex = new Regex("\\{.*?\\}");
string replacedRouteTemplate = regex.Replace("/path/{name}/{id}/path2", "[^/]+");

bool result = Regex.IsMatch("/path/damon/1512312/path2", replacedRouteTemplate);
Console.WriteLine($"Result 1: {result}");

replacedRouteTemplate = regex.Replace("/path/{id}/path2", "[^/]+");
result = Regex.IsMatch("/path/1512312/path2", replacedRouteTemplate);
Console.WriteLine($"Result 2: {result}");

Код выше выводит:

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