我有一个像这样的网址列表:
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);
我无法弄清楚原因。
提前致谢
答案 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”。对于顺序匹配,您不使用方括号(尽管您可以使用圆括号对顺序匹配进行分组)。