Страницы

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

суббота, 8 июня 2019 г.

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

Имеется ссылки двух видов:
https://www.test.com/common/inc/productDetail_price.jsp?skuId=2260697&productId=xlsImpprod4130103 https://www.test.com/milk?productId=xlsImpprod18451151
Суть задачи такова: если в ссылке не содержится 'productDetail_price.jsp', то вывести значение параметра 'productId'
Как я делаю:
(?Если использовать противоположный вариант:
(?<=productDetail\_price\.jsp.).*productId=(\w+) - выводит противоположный вариант, который мне нужен
Важный момент: задачу необходимо решить только регулярными выражениями
Адрес для тестов: http://rubular.com/r/6YZVmhMbUj
Буду рад любым советам


Ответ

Рекомендую распарсить 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+ букв, цифр или _

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

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