【发布时间】:2020-04-30 15:08:22
【问题描述】:
我想使用黑名单和白名单从 URL 中识别和删除一些参数。但是,我想在黑名单/白名单上使用正则表达式,而不是单词列表。黑名单正则表达式中的每个匹配项都将被删除,除非白名单正则表达式允许。
此正则表达式将用于 Java 上的 replaceAll String 方法。我几乎找到了解决方案,但我在处理一般情况时遇到了一些麻烦。
例如,如果我的列表配置了正则表达式:
- 白名单:
(param1) - 黑名单:
(param1|param2)
目标:删除param2 而不是param1,因为param1 在白名单正则表达式中。
我创建了一个表达式,将白名单置于否定前瞻:
(?!(param1))(param1|param2)
并将这个表达式与另一个正则表达式结合起来识别Url查询字符串的分隔符:
(?<=[?&;])(?!(param1))(param1|param2)=.*?($|[&;])
result 是只匹配 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=1
Java 代码类似于:
url.replaceAll("(?<=[?&;])" + asNegativeLookahead(whitelist, blacklist) + "=.*?($|[&;])", "")
.replaceAll("[?&;]$", "");
到目前为止,一切都很好。
但是当我在黑名单上使用一些更通用的正则表达式时,就会出现问题,例如.*:
- 白名单:
(param1) - 黑名单:.*
当第一个参数是 param1 时,这使得matches everything 在 param1 之后,忽略白名单正则表达式。
我找到了一个解决方案,用另一个正则表达式识别每个参数,并将每个组与白名单和黑名单匹配,但我对这段代码不太有信心,因为我需要手动重新创建带有参数的 Url 并且仍然需要使用负前瞻,并没有真正简化解决方案。
【问题讨论】:
-
我认为这部分不会匹配 param1,因为断言指出右边的不是 param1
(?<=[?&;])(?!(param1))(param1|param2)