Регулярное выражение для части ресурса URL - PullRequest
0 голосов
/ 11 мая 2018

Контекст

У меня есть код, который принимает URL-путь и заменяет параметры пути на '*'.Все мои URL-адреса соответствуют правилам JSON API .Все действительные части ресурса URL следуют следующим правилам:

  • Имена участников ДОЛЖНЫ начинаться и заканчиваться символами «az» (от U + 0061 до U + 007A)
  • Имена членов ДОЛЖНЫ содержать только символы «az» (от U + 0061 до U + 007A), «0-9» (от U + 0030 до U + 0039) и дефис минус (U + 002D HYPHEN-MINUS, «-«) как разделитель между несколькими словами.

Параметр передачи обычно является идентификатором (число, uuid, guid и т. Д.).

Вот несколько примеровиз преобразований:

  • /user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f/info -> /user/*/info
  • /user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f -> /user/*
  • /user/1 -> /user/*

Что у меня

/^[a-z][a-z0-9-]*[a-z]$/

Проблема в том, что он не обрабатывает uuid как параметр пути.

Вот моя функция, которая анализирует URL (извините, неесть время, чтобы создать jsfiddle):

const escapeResourcePathParameters = resource => resource
  .substr(resource.startsWith('/') ? 1 : 0)
  .split('/')
  .reduce((url, member) => {
     const match = member.match(REGEX.JSONAPI_RESOURCE_MEMBER);

     const part = match
         ? member
         : '*';

     return `${url}/${part}`;
}, '');

Вопросы

Мне нужно регулярное выражение, которое следует приведенным выше правилам и работает для приведенных выше примеров.

UPD: Я добавил свою функцию, котораяЯ использую для разбора URL.Чтобы проверить свое регулярное выражение, просто замените его на REGEX.JSONAPI_RESOURCE_MEMBER и передайте URL как /user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f/info, оно должно вернуть /user/*/info

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете использовать осмотры:

(?<=\/)[a-z][a-z0-9-]*[a-z](?=\/)

Как отмечалось в моем комментарии, нет необходимости использовать якоря ^ или $,Также избежать косой черты \/.Регулярное выражение будет соответствовать шаблону [a-z][a-z0-9-]*[a-z] только в окружении косых черт.

/user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f/info # result:  /*/*/info
/user/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f      # result:  /*/e09e4f9f-cfcd-4a23-a88f-b9f2f265167f
/user/1                                         # result: /*/1

Для соответствия UUID используйте:

(?<=\/)[a-z0-9-]{8}-(?:[a-z0-9-]{4}-){3}[a-z0-9-]{12}(?=\/)

Формат UUID описан здесь: https://en.wikipedia.org/wiki/Universally_unique_identifier#Format

0 голосов
/ 11 мая 2018

Я предполагаю, что вы ищете регулярное выражение для захвата UUID:

это должно работать в javascript:

/[a-z][a-z0-9]+[-]+[a-z0-9-]+[a-z]/

Я полагаю, что UUID должен содержать как минимум два слова,так хоть один "-"

let a = "/user/e09e4f9f-cfcd-4a23-a88a/info"

const match = a.match(/[a-z][a-z0-9]+[-]+[a-z0-9-]+[a-z]/)

console.log(match[0])

Так что для вашего кода это должно быть что-то вроде

 const escapeResourcePathParameters = resource => resource
  .substr(resource.startsWith('/') ? 1 : 0)
  .split('/')
  .reduce((url, member) => {
    // with  REGEX.JSONAPI_RESOURCE_MEMBER = /[a-z][a-z0-9]*[-]+[a-z0-9-]+[a-z]/
    return `${url}/${member.replace(REGEX.JSONAPI_RESOURCE_MEMBER, '*')}`;

 }, '');
...