1

我有一个这样的 URL 列表: 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);

我不知道为什么。

提前致谢

4

2 回答 2

3

假设你的意思

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

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

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

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

Boolean find = Pattern.matches(".*/(\\d+)\\.jpg$", url);
于 2013-06-02T15:36:21.217 回答
3

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

例如:

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”。对于顺序匹配,您不使用方括号(尽管您可以使用圆括号对顺序匹配进行分组)。

于 2013-06-02T15:38:27.377 回答