Я хотел бы идентифицировать и удалить некоторые параметры из URL, используя черный и белый списки. Тем не менее, я хотел бы использовать регулярные выражения в черный список / белый список, а не список слов. Каждое совпадение в регулярном выражении черного списка будет удалено, кроме случаев, когда регулярное выражение белого списка может разрешить.
Это регулярное выражение будет использоваться в методе replaceAll
String в Java. Я почти нашел решение, но у меня возникли некоторые проблемы с выполнением общих дел.
Например, если у меня список, настроенный с помощью регулярных выражений:
- белый список :
(param1)
- черный список:
(param1|param2)
Цель: удалить param2
, а не param1
, поскольку param1
входит в регулярное выражение белого списка.
Я создаю выражение, помещающее белый список в отрицательный заголовок:
(?!(param1))(param1|param2)
И объединяю это выражение с другим регулярным выражением для определения разделителей строки запроса Url:
(?<=[?&;])(?!(param1))(param1|param2)=.*?($|[&;])
результат соответствует только параметру 2:
https://www.so.com?param2=2¶m1=1
https://www.so.com?param1=1
https://www.so.com?param1=1¶m2=2
https://www.so.com?param3=3¶m1=1¶m2=2
https://www.so.com?param3=3¶m2=2¶m1=1
Код Java выглядит примерно так:
url.replaceAll("(?<=[?&;])" + asNegativeLookahead(whitelist, blacklist) + "=.*?($|[&;])", "")
.replaceAll("[?&;]$", "");
Пока все хорошо.
Но проблема возникает, когда я использовал более общее регулярное выражение в черном списке, например .*
:
- белый список:
(param1)
- черный список:. *
Это дает совпадение со всем после param1, когда первый аргумент - param1, игнорируя регулярное выражение белого списка.
Я нашел решение, идентифицирующее каждый параметр с помощью другого регулярного выражения и сопоставляющее каждую группу с белым и черным списками, но я не совсем уверен в этом коде, потому что мне нужно вручную воссоздать URL-адрес с параметрами и все еще нужно использовать отрицательный прогноз, не очень упрощая решение.