Страницы

Поиск по вопросам

вторник, 31 марта 2020 г.

Регулярные выражения с условием

#регулярные_выражения #ruby


Имеется ссылки двух видов:


https://www.test.com/common/inc/productDetail_price.jsp?skuId=2260697&productId=xlsImpprod4130103
https://www.test.com/milk?productId=xlsImpprod18451151


Суть задачи такова: если в ссылке не содержится 'productDetail_price.jsp', то вывести
значение параметра 'productId'

Как я делаю: 

(?


Ответы

Ответ 1



Рекомендую распарсить URL с помощью стандартного URI + CGI: s = 'https://www.test.com/common/inc/productDetail_price.jsp?skuId=2260697&productId=xlsImpprod4130103' uri = URI.parse(s) if uri.path.split('/').last != 'productDetail_price.jsp' puts CGI::parse(uri.query)["productId"] end Подробности uri = URI.parse(s) - инициализируем объект URI if uri.path.split('/').last != 'productDetail_price.jsp' - разбиваем полученный "путь" по / и проверяем последний элемент списка. Если он не равен productDetail_price.jsp, CGI::parse(uri.query)["productId"] - парсим строку запроса и берем значение параметра productId. Онлайн-демо на Ruby Если productDetail_price.jsp может находиться в любом месте URL, можно заменить if uri.path.split('/').last != 'productDetail_price.jsp' на if !uri.path.include? 'productDetail_price.jsp' Регулярное выражение Если нужно решение на основе регулярного выражения, используйте s[/^(?!.*\bproductDetail_price\.jsp\b).*productId=(\w+)/, 1] или s[/^(?!.*\bproductDetail_price\.jsp\b).*productId=\K\w+/] См. демо выражения на Rubular Подробности ^ - начало строки (?!.*\bproductDetail_price\.jsp\b) - в строке не должно быть целого слова productDetail_price.jsp (точка экранирована, чтобы находила только символ ., \b — это границы слова, (?!...) — негативный блок предварительного просмотра вперёд, если его шаблон находит совпадение, совпадение всего шаблона не находится). .*productId= - 0 и более любых символов (кроме знака перехода на новую строку), как можно больше, до последнего вхождения последующих шаблонов, и потом productId= (\w+) - Захватывающая подмаска №1: 1+ букв, цифр или _ \K\w+ - альтернатива - можно использовать \K, чтобы очистить буфер совпадения, и, таким образом, в нем окажутся только последние 1+ букв, цифр или _.

Ответ 2



С использованием предпросмотра назад надо исправить так: function check(s) { var m = s.match(/(?

Комментариев нет:

Отправить комментарий