Java正则表达式:提取文件名不起作用

时间:2013-06-02 15:27:19

标签: java regex

我有一个像这样的网址列表: http://mysite.es/img/p/3/6/2/5/6/36256.jpg

我需要更换36256部件。

我的正则表达式如下:

Boolean find = Pattern.matches("^[http://].+/(?<number>\\d+)[\\.jpg]$", url);

但它总是返回假。我做错了什么? 我认为问题是URL上有很多“/”但并非所有URL都具有相同数量的/。

这有效:

Boolean find = Pattern.matches("[\\.jpg]$", url);

这样做不起作用:

Boolean find = Pattern.matches("/(\\d+)[\\.jpg]$", url);

我无法弄清楚原因。

提前致谢

2 个答案:

答案 0 :(得分:3)

假设你的意思

Boolean find = Pattern.matches(".*[\\.jpg]$", url);

Boolean find = Pattern.matches(".*/(\\d+)[\\.jpg]$", url);

第一个模式匹配,因为它只需要在结束前匹配任何字符.jpg。第二个不匹配,因为它需要在位于URL String末尾的character class中指定的字符之前的前一个数字。

您需要删除字符类的使用。

Boolean find = Pattern.matches(".*/(\\d+)\\.jpg$", url);

答案 1 :(得分:3)

首先,如果您的网址都有“/”字符和文件类型扩展名,那么您可能不需要正则表达式。

例如:

String url = "http://mysite.es/img/p/3/6/2/5/6/36256.jpg";
String toReplace = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
System.out.println(toReplace);
String replacedURL = url.replace(toReplace, "foo");
System.out.println(replacedURL);

修改

// solution with regex
Pattern fileName = Pattern.compile(".+(?<!/)/(?!/)(.+?)\\..+?");
Matcher matcher = fileName.matcher(url);
if (matcher.find()) {
    System.out.println(matcher.group(1));
    String replacedURLWithRegex = url.replace(matcher.group(1), "blah");
    System.out.println(replacedURLWithRegex);
}

输出:

36256
http://mysite.es/img/p/3/6/2/5/6/foo.jpg

编辑输出:

36256
http://mysite.es/img/p/3/6/2/5/6/blah.jpg

关于正则表达式中的错误,“[\ .jpg]”将尝试匹配方括号定义的类中的任何字符,即“。”或“j”或“p”或“g”,而不是序列中的“.jpg”。对于顺序匹配,您不使用方括号(尽管您可以使用圆括号对顺序匹配进行分组)。