我有以下正则表达式:
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 =之后至少有一个大写字母。
谢谢。
答案 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+次,而不是"
或空格字符")
匹配"
并关闭捕获组不使用组,您可以使用:
href\s?=\s?"[^A-Z\s]*[A-Z][^\s"]*"