【问题标题】:non-capturing group still shows?非捕获组仍然显示?
【发布时间】:2021-08-24 10:31:47
【问题描述】:

我正在尝试从 url 中的第三个 / 开始获取字符串。

这是网址:

http://192.168.1.253:18888/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png

我希望得到/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png

所以我使用了以下正则表达式(?:\/\/.+)\/.+

?: 标记为非捕获组,因此不应匹配 //192.168.1.253:18888

但是当我在 regex101.com 中测试时,它的结果是//192.168.1.254:18888/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png

这是为什么呢?

【问题讨论】:

  • 非捕获组使用它们匹配的文本,它们不是后视。你需要(?<!\/)\/[^\/].* 或类似的东西。更好的是,使用您的语言的 URL 解析功能。
  • 请将您的编程语言添加到标签 - 每种语言的正则表达式更改。
  • 您可以匹配http:// 直到第一个/ 并捕获其余的http://[^/]+(.+)

标签: java regex url


【解决方案1】:

regex101.com 结果为//192.168.1.254:18888/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png 的原因是非捕获组(?: ... ) 消耗了它们匹配的文本。因此,匹配文本 Regex101 的位置显示为匹配。

对于诸如 Java 之类的语言,只需匹配在初始双斜杠之后不包含正斜杠的所有内容,并且只保持组匹配:

Regex: `\/\/[^\/]+(.+)`
Input: `http://192.168.1.253:18888/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png`
Ignore Match1: `//192.168.1.253:18888/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png`
Keep Group1: `/2021/03/11/896459e4-875f-455a-a2cb-768c879555e7.png`

【讨论】:

  • 我对Java很熟悉,但是有没有使用非捕获组的全局解决方案?每种语言都要重新学习很痛苦,比如 SQL
  • 第二个代码块应该有点适合大多数语言,但不幸的是,每种编程语言都有不同的正则表达式实现,因此不太可能所有语言都接受相同的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2022-11-13
  • 2021-09-24
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多