Регулярное выражение для получения параметров url
У меня есть строка '/abc/x=1+2&y=25&c=1', где 'x=1+2&y=25&c=1' является определенным набором фильтров. Я хочу написать функцию, которая бы с помощью регулярки доставала значения каждого фильтра, т.е.:
1) getSubString(str, 'x') - должна вернуть '1+2'
2) getSubstring(str, 'y') - должна вернуть '25'
3) getSubstring(str, 'c') - должна вернуть '1'
Моя функция пока что выглядит так:
const getSubString = (pathname, filterName) => {
const regexp = new RegExp(`${filterName}=(.*)&`);
return pathname.match(regexp)[1];
}
Не понимаю 2 момента:
- В первом случая мне возвращается '1+2&y=25', то есть почему то поиск идет до последнего символа & в строке. Как сделать, чтобы движок искал с переданного мной 'x' до первого появления &?
- В 3ем случае движок не находит никаких совпадений, т.к. в регулярке указан последним символом &. Как обработать такой кейс, когда возможно окончания на & или конец строки? Я пробовал заканчивать регулярку на (&|\z) - не получилось.
Ответы (1 шт):
В выражении (.*)& первый шаблон захватывает 0 и более символов, отличных от перевода строки, до последнего вхождения символа &.
В данном случае требуется найти текст до первого (ближайшего) вхождения символа & или до конца строки:
(.*?)(?:&|$)
(.*?)(?=&|$)
([^&]*)
Из трёх перечисленных выше шаблонов ([^&]*) является самым быстрым, он же также находит переводы строк.
Используйте
const getSubString = (pathname, filterName) => {
const regexp = new RegExp(`${filterName}=([^&]*)`);
const res = pathname.match(regexp)
return res ? res[1] : undefined;
}
const text = '/abc/x=1+2&y=25&c=1';
console.log(getSubString(text, 'x'));
console.log(getSubString(text, 'y'));
console.log(getSubString(text, 'c'));
Чтобы совпадение происходило только после /, ? или &, измените регулярное выражение на
new RegExp(`[/?&]${filterName}=([^&]*)`);