我想要获取
http://d1oiazdc2hzjcz.cloudfront.net/promotions/precious/2x/p_608_o_6288_precious_image_1419866866.png
来自
url(http://d1oiazdc2hzjcz.cloudfront.net/promotions/precious/2x/p_608_o_6288_precious_image_1419866866.png)
我试过这段代码:
String a = "";
Pattern pattern = Pattern.compile("url(.*)");
Matcher matcher = pattern.matcher(imgpath);
if (matcher.find()) {
a = (matcher.group(1));
}
return a;
但是a == (http://d1oiazdc2hzjcz.cloudfront.net/promotions/precious/2x/p_639_o_4746_precious_image_1419867529.png)
我该如何微调?
答案 0 :(得分:3)
给出
final String s = "url(http://d1oiazdc2hzjcz.cloudfront.net/promotions/precious/2x/p_608_o_6288_precious_image_1419866866.png)";
如果字符串的格式始终相同,则简单的substring(4,s.length()-1)
会更好。
您必须使用(
转义\(
,因此在Java中(您必须转义\
)它将\\(
与)
相同
然后,您可以使用url\\((.+)\\)
,test it here!
在来到这里之前学习使用RegEx101.com,它会立即指出这样的错误。
答案 1 :(得分:1)
正如您似乎已经知道(
和)`代表组,这意味着在正则表达式中
url(.*)
(.*)
会将url
之后的所有内容放在第1组中,如果是
url(http://d1oiazdc2hzjcz.cloudfront.net/promotions/precious/2x/p_608_o_6288_precious_image_1419866866.png)
将是
(http://d1oiazdc2hzjcz.cloudfront.net/promotions/precious/2x/p_608_o_6288_precious_image_1419866866.png)
如果要从匹配项中排除(
和)
,则需要将其文字添加到regex,这意味着您需要将其转义。有很多事情要做,比如在每个帖子之前添加\
,或者用[
]
包围它们。
正则表达式的其他问题是.*
找到了最大潜在匹配,但由于.
表示任何字符(行分隔符除外),因此它还可以包含(
和)
。要解决此问题,您可以通过在*
之后添加?
来使"url\\((.*?)\\)"
---------------
url
\\( - ( literal
(.*?) - group 1
\\) - ) literal
量词不情愿,这样您的最终正则表达式就可以写成字符串
.
或者您可以使用)
字符类来代替"url\\(([^)]*)\\)"
之外的所有字符,例如
{{1}}
答案 2 :(得分:0)
试试这个正则表达式:
url\((.*?)\)
最外面的括号将被转义,因此它们将按字面匹配。内括号用于捕获组。 。*之后的问号是使匹配变得懒惰,因此找到的第一个右括号将结束该组。
请注意,要在Java中使用此正则表达式,您必须另外转义反斜杠,以便将上述正则表达式表示为字符串文字:
String regex = "url\\((.*?)\\)";
答案 3 :(得分:0)
您需要转义()
以匹配字符串中的括号,然后在要在第1组(实际网址)中提取的部分周围添加另一组()
。我还将括号内的部分更改为[^)]*
,它将匹配所有内容,直到找到)
。见下文:
url\(([^)]*)\)