我的java正则表达式缺少什么?

时间:2014-12-29 15:32:45

标签: java regex

我想要获取

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)

我该如何微调?

4 个答案:

答案 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\(([^)]*)\)