使用正则表达式在 URL 中找不到大写字母



我有以下正则表达式:

(href[s]?=[s]?)("[^"]*/*[^"]*")

使用以下测试字符串:

href="http://mysite.io/Plan-documents"

我有两个捕获组。 一个带有 href= ,另一个是过去的一切。 现在,我只想显示第二个捕获组中任何位置有大写字母的匹配项。 我试过了:

(href[s]?=[s]?)("[A-Z]*[^"]*/*[^"]*")

尝试只让这个正则表达式返回包含大写的 URL。 没有运气。无论我是否将测试字符串修改为:

href="http://mysite.io/plan-documents"

我仍然得到匹配。 如果字符串中至少有一个大写字母超过 href=,我只想在 href 字符串上匹配。

谢谢。

您不会获得正确的匹配项,因为在第二个捕获组中,双引号之间的所有内容都使用量词*该量词匹配 0 或更多次。

首先引擎匹配 0+ 次[A-Z]*。它不存在,但还可以,因为 0+ 次量词。 然后[^"]*下一部分将匹配,直到它遇到下一个"

以下/*不存在,但也没问题,因为 0+ 次量词后跟[^"]*这也是可以的。

相反,您可以做的是先匹配大写而不是大写,直到匹配大写,然后匹配直到右双引号。

(hrefs?=s?)("[^A-Zs]*[A-Z][^s"]*")

解释

  • (hrefs?=s?)捕获组,匹配 href= 用可选的空格字符包围
  • ("启动捕获组并匹配"
    • [^A-Zs]*匹配 0+ 次不是大写或空格字符
    • [A-Z]匹配 1 个大写字符
    • [^"s]*匹配 0+ 次不是"或空格字符
  • ")匹配"和接近捕获组

正则表达式演示

在不使用组的情况下,您可以使用:

hrefs?=s?"[^A-Zs]*[A-Z][^s"]*"

正则表达式演示

最新更新