【问题标题】:Create a regex from a blacklist and whitelist regex expressions to identify and remove url parameters从黑名单和白名单正则表达式创建正则表达式以识别和删除 url 参数
【发布时间】: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&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 时,这使得matches everything 在 param1 之后,忽略白名单正则表达式。

我找到了一个解决方案,用另一个正则表达式识别每个参数,并将每个组与白名单和黑名单匹配,但我对这段代码不太有信心,因为我需要手动重新创建带有参数的 Url 并且仍然需要使用负前瞻,并没有真正简化解决方案。

【问题讨论】:

  • 我认为这部分不会匹配 param1,因为断言指出右边的不是 param1 (?&lt;=[?&amp;;])(?!(param1))(param1|param2)

标签: java regex


【解决方案1】:

我建议使用这种组合模式:

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

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

this demo

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多