Ищу одно регулярное выражение для замены моей строки - PullRequest
1 голос
/ 07 ноября 2019

У меня проблема с регулярным выражением, и мне нужна помощь. Текущий URL имеет тип /search/:year/:month/:day/xxxx с :month и :day может существовать или нет. Теперь мне нужно заменить /search/:year/:month/:day patern в моем URL пустой строкой. Смысл получить остатки части URL. Итак, это пример ниже

1. '/ Search / 2017/02/03 / category / gun' => '/ category / gun'

2. '/ Search / 2017 /02/03 / '=>' / '

3.' / Search / 2017/01 / category / gun '=>' / category / gun / '

4.' / Search/ 2017 / категория / пистолет / '=>' / категория / пистолет / '

5.' / Поиск / 2018 /? Категория = пистолет и тип% 5B% 5D = sendo '=>' /? Category = пистолет и тип% 5B% 5D = sendo / '

Я пытаюсь использовать регулярное выражение = /^\/search\/((?:\d{4}))(?:\/((?:\d|1[012]|0[1-9])))?(?:\/((?:[0-3]\d)))/

Но это не удалось в случае /search/2017/category/gun/

const regex = /^\/search\/((?:\d{4}))(?:\/((?:\d|1[012]|0[1-9])))?(?:\/((?:[0-3]\d)))/
const testLink = [
  '/search/2017/02/03/category/gun/',
  '/search/2017/01/category/gun/',
  '/search/2017/category/gun/',
  '/search/2017/02/03/category/gun/',
  '/search/2018/?category=gun&type%5B%5D=sendo'

]

testLink.forEach((value, i) => {
  console.log(value.replace(regex, ''))
  console.log('-------------------')
})

Ответы [ 4 ]

1 голос
/ 07 ноября 2019

Используйте этот шаблон регулярных выражений (\/search\/.*\d+)(?=\/)

Демо

const regex = /(\/search\/.*\d+)(?=\/)/g;
const testLink = [
  '/search/2017/02/03/category/gun/',
  '/search/2017/01/category/gun/',
  '/search/2017/',
  '/search/2017/02/03/category/gun/',
  '/search/2018/?category=gun&type%5B%5D=sendo'
]

testLink.forEach((value, i) => {
  console.log(value.replace(regex, ''))
  console.log('-------------------')
})
0 голосов
/ 07 ноября 2019

вы можете использовать то же регулярное выражение, но в обратном порядке эту часть (?:\d|1[012]|0[1-9]), как указано ниже (?:\d|1[012]|0[1-9]), и сделать последнюю группу необязательной, как показано ниже ((?:[0-3]\d)))?

const regex = /^\/search\/((?:\d{4}))(?:\/((?:0[1-9]|1[012]|\d)))?(?:\/((?:[0-3]\d)))?/
const testLink = [
  '/search/2017/02/03/category/gun/',
  '/search/2017/01/category/gun/',
  '/search/2017/category/gun/',
  '/search/2017/02/03/category/gun/'
]

output

/ категория / пистолет /

/ категория / пистолет /

/ категория / пистолет /

/ категория / пистолет /

если вы уверены в формате даты, чтобы вы могли упростить ваш опыт до ^\/search\/\d{4}(?:\/\d{1,2}){0,2}

0 голосов
/ 07 ноября 2019

Вот один из способов:

strings = [
    '/search/2017/02/03/category/gun',
    '/search/2017/02/03/',
    '/search/2017/01/category/gun',
    '/search/2017/category/gun/',
]; for (var i = 0; i < strings.length; i++) {
    alert(strings[i].replace(/\/search\/[0-9\/]+(\/)(category\/[^\/$]+)?.*/,'$1$2'));
}
0 голосов
/ 07 ноября 2019

Разделение по следующему шаблону, кажется, работает:

\d{4}(?:/\d{2})*    

Это поместит желаемую цель в качестве второго элемента в массиве разделения, причем первая часть будет тем, что предшествует цифрам года в частяхпуть.

input = '/search/2017/02/03/category/gun';
parts = input.split(/\d{4}(?:\/\d{2})*/);
console.log(parts[1]);
console.log('/search/2017/02/03'.split(/\d{4}(?:\/\d{2})*/)[1]);
console.log('/search/2017/01/category/gun'.split(/\d{4}(?:\/\d{2})*/)[1]);
console.log('/search/2017/category/gun/'.split(/\d{4}(?:\/\d{2})*/)[1]);

Независимо от того, ожидаете ли вы конечного разделителя конечного пути или нет, не совсем ясно. В любом случае, ответ выше может быть изменен в соответствии с этим ожиданием.

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