Создайте регулярное выражение из выражений регулярного выражения черного и белого списков для определения и удаления параметров URL - PullRequest
1 голос
/ 30 апреля 2020

Я хотел бы идентифицировать и удалить некоторые параметры из URL, используя черный и белый списки. Тем не менее, я хотел бы использовать регулярные выражения в черный список / белый список, а не список слов. Каждое совпадение в регулярном выражении черного списка будет удалено, кроме случаев, когда регулярное выражение белого списка может разрешить.

Это регулярное выражение будет использоваться в методе replaceAll String в Java. Я почти нашел решение, но у меня возникли некоторые проблемы с выполнением общих дел.

Например, если у меня список, настроенный с помощью регулярных выражений:

  • белый список : (param1)
  • черный список: (param1|param2)

Цель: удалить param2, а не param1, поскольку param1 входит в регулярное выражение белого списка.

Я создаю выражение, помещающее белый список в отрицательный заголовок:

(?!(param1))(param1|param2)

И объединяю это выражение с другим регулярным выражением для определения разделителей строки запроса Url:

(?<=[?&;])(?!(param1))(param1|param2)=.*?($|[&;])

результат соответствует только параметру 2:

https://www.so.com?param2=2&param1=1
https://www.so.com?param1=1
https://www.so.com?param1=1&param2=2
https://www.so.com?param3=3&param1=1&param2=2
https://www.so.com?param3=3&param2=2&param1=1

Код Java выглядит примерно так:

url.replaceAll("(?<=[?&;])" + asNegativeLookahead(whitelist, blacklist) + "=.*?($|[&;])", "")
   .replaceAll("[?&;]$", "");

Пока все хорошо.

Но проблема возникает, когда я использовал более общее регулярное выражение в черном списке, например .*:

  • белый список: (param1)
  • черный список:. *

Это дает совпадение со всем после param1, когда первый аргумент - param1, игнорируя регулярное выражение белого списка.

Я нашел решение, идентифицирующее каждый параметр с помощью другого регулярного выражения и сопоставляющее каждую группу с белым и черным списками, но я не совсем уверен в этом коде, потому что мне нужно вручную воссоздать URL-адрес с параметрами и все еще нужно использовать отрицательный прогноз, не очень упрощая решение.

1 Ответ

2 голосов
/ 30 апреля 2020

Я предлагаю использовать этот комбинационный шаблон:

([?&](?!.*&)|(?<=[?&;]))(?!(param1))(?=(param1|param2))([^&;=\n\r]*)=.*?($|[&;])

                whitelist ◄└──────┘    └─────────────┘► blacklist

См. это демо .

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