我想识别和删除一些参数从一个Url使用黑名单和白名单。但是,我想在黑名单/白名单上使用正则表达式,而不是使用单词列表。黑名单正则表达式上的每一个匹配都将被删除,除非白名单正则表达式允许。
这个正则表达式将在Java上的replaceAll String方法上使用。我几乎找到了解决办法,但在一般情况下,我遇到了一些麻烦。
例如,如果我用正则表达式配置了列表:
(param1)(param1|param2)目标:删除param2而不是param1,因为param1在白名单正则表达式中。
我创建了一个表达式,将白名单放在负面展望上:
(?!(param1))(param1|param2)并将该表达式与另一个正则表达式组合起来,以标识Url查询字符串分隔符:
(?<=[?&;])(?!(param1))(param1|param2)=.*?($|[&;])结果只与param2匹配:
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=1Java代码类似于:
url.replaceAll("(?<=[?&;])" + asNegativeLookahead(whitelist, blacklist) + "=.*?($|[&;])", "")
.replaceAll("[?&;]$", "");到现在为止还好。
但是,当我在黑名单上使用一些更一般的正则表达式(如)时,就会出现.*问题。
(param1)这使得匹配一切在param1之后,当第一个参数是param1时,忽略了白名单正则表达式。
我找到了一个用另一个正则表达式标识每个参数的解决方案,并将每个组与白名单和黑名单相匹配,但我对这段代码并不完全有信心,因为我需要使用参数手动重新创建Url,并且仍然需要使用负前瞻性,而不是真正简化解决方案。
发布于 2020-04-30 15:33:44
我建议使用这种组合模式:
([?&](?!.*&)|(?<=[?&;]))(?!(param1))(?=(param1|param2))([^&;=\n\r]*)=.*?($|[&;])
whitelist ◄└──────┘ └─────────────┘► blacklist见这个演示。
https://stackoverflow.com/questions/61526661
复制相似问题