【问题标题】:Regex for "after last /", "before possible ?", "last 32 characters"?“在最后 / 之后”,“可能之前?”,“最后 32 个字符”的正则表达式?
【发布时间】:2021-07-12 15:48:44
【问题描述】:

如何部署正则表达式来匹配 URL 中可能有多个公式的字符串?

在下面的例子中,匹配的字符串恰好是“6c39b9cd8b5c4ae89aab69200a4608b1”?可以是任意 32 个字符,总是 32 个字符。

我一直在使用(.{0,32})((?=\?)|$),我认为它的意思类似于“最后一个斜杠后的最后 32 个字符,直到问号或结尾” - 但它在下面的示例 3/ 和 4/ 中捕获了两个组,它应该只捕获第一个。

1/ 在最后一个斜线之后,即 ...

https://www.example.com/folder/6c39b9cd8b5c4ae89aab69200a4608b1

2/ 但并不总是立即(即结束前可能是 32 个字符)...

https://www.example.com/folder/Extraneous-material-here-6c39b9cd8b5c4ae89aab69200a4608b1

3/ 除了,有时在所需文本之后会有一个查询字符串(因此,问号前有 32 个字符,但并不总是存在问号)...

https://www.example.com/folder/6c39b9cd8b5c4ae89aab69200a4608b1?v=593af44a9e9b4da6bb2ee491c949b033

4/ 有时可能在之后有一个查询字符串,而在之前有一些无关的文本......

https://www.example.com/folder/Extraneous-material-here-6c39b9cd8b5c4ae89aab69200a4608b1?v=593af44a9e9b4da6bb2ee491c949b033

...用我目前的表达方式,这个匹配 6c39b9cd8b5c4ae89aab69200a4608b1 和 593af44a9e9b4da6bb2ee491c949b033。

【问题讨论】:

  • 您可以使用([a-fA-F0-9]{32})(?:\?.*)?$ 正则表达式捕获该值。见this demo
  • @WiktorStribiżewexample.com/folder/…example.com/folder/…似乎错误地返回位INC查询字符串 “6c39b9cd8b5c4ae89aab69200a4608b1?V = 593af44a9e9b4da6bb2ee491c949b033”(第1场)和 “6c39b9cd8b5c4ae89aab69200a4608b1”(组1)。 6c39b9cd8b5c4ae89aab69200a4608b1 只需要一场比赛。
  • 正则表达式匹配正确。这就是您需要访问的第 1 组值。你的编程环境是什么?
  • @WiktorStribiżew iOS 快捷方式,其匹配文本操作是正则表达式。它返回完整但包括查询字符串。
  • 也许看看(?:-|\/)(.{0,32})(?:$|\?)和第1组。示例:regex101.com/r/Md8R2i/1

标签: regex


【解决方案1】:

您的正则表达式中没有提到斜杠。 . 匹配任何字符,您只需在问号或字符串结尾之前匹配其中的 32 个。

从您的示例中,您似乎需要 32 个十六进制字符,由斜线或破折号和字符串结尾或问号包围。

(?<=[/-])[a-f0-9]{32}(?=\?|$)

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 2023-03-03
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多