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

时间:2019-04-11 22:15:54

标签: regex

我有以下正则表达式:

Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY));

使用以下测试字符串:

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

我有两个捕获小组。一个带有href =,另一个就是所有超出的内容。现在,我只想显示第二个捕获组中任何地方有大写字母的匹配项。我尝试过:

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

尝试仅使此正则表达式返回带有大写字母的URL。没运气。无论我是否将测试字符串修改为:

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

我仍然有比赛。我只想在href字符串上匹配,如果字符串中的href =之后至少有一个大写字母。

谢谢。

1 个答案:

答案 0 :(得分:2)

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

首先,引擎匹配0+次[A-Z]*。由于0+时间量词,它不存在但没关系。然后下一部分[^"]*将匹配,直到恰好遇到下一个"

后面的\/*不存在,但也可以,因为0+时间量词后面跟着[^"]*也可以。

您可能要做的是先匹配大写,然后再匹配直到右双引号。

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

说明

  • (href\s?=\s?)捕获组,匹配href =,并由可选的空白字符包围
  • ("开始捕获组并匹配"
    • [^A-Z\s]*匹配0+次而不是大写字符或空格字符
    • [A-Z]匹配1个大写字符
    • [^"\s]*匹配0+次,而不是"或空格字符
  • ")匹配"并关闭捕获组

Regex demo

不使用组,您可以使用:

href\s?=\s?"[^A-Z\s]*[A-Z][^\s"]*"

Regex demo