首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从黑名单和白名单regex表达式中创建regex以标识和删除url参数。

从黑名单和白名单regex表达式中创建regex以标识和删除url参数。
EN

Stack Overflow用户
提问于 2020-04-30 15:08:22
回答 1查看 881关注 0票数 1

我想识别和删除一些参数从一个Url使用黑名单和白名单。但是,我想在黑名单/白名单上使用正则表达式,而不是使用单词列表。黑名单正则表达式上的每一个匹配都将被删除,除非白名单正则表达式允许。

这个正则表达式将在Java上的replaceAll String方法上使用。我几乎找到了解决办法,但在一般情况下,我遇到了一些麻烦。

例如,如果我用正则表达式配置了列表:

  • 白名单:(param1)
  • 黑名单:(param1|param2)

目标:删除param2而不是param1,因为param1在白名单正则表达式中。

我创建了一个表达式,将白名单放在负面展望上:

代码语言:javascript
复制
(?!(param1))(param1|param2)

并将该表达式与另一个正则表达式组合起来,以标识Url查询字符串分隔符:

代码语言:javascript
复制
(?<=[?&;])(?!(param1))(param1|param2)=.*?($|[&;])

结果只与param2匹配:

代码语言:javascript
复制
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代码类似于:

代码语言:javascript
复制
url.replaceAll("(?<=[?&;])" + asNegativeLookahead(whitelist, blacklist) + "=.*?($|[&;])", "")
   .replaceAll("[?&;]$", "");

到现在为止还好。

但是,当我在黑名单上使用一些更一般的正则表达式(如)时,就会出现.*问题。

  • 白名单:(param1)
  • 黑名单:.*

这使得匹配一切在param1之后,当第一个参数是param1时,忽略了白名单正则表达式。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-30 15:33:44

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

代码语言:javascript
复制
([?&](?!.*&)|(?<=[?&;]))(?!(param1))(?=(param1|param2))([^&;=\n\r]*)=.*?($|[&;])

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

这个演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61526661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档