前提:下面是的字符串中有多个img,有的是在同一行,有的在下一行
String str = "<img src=\"/y/186.png\"/>.......................<img src=\"server/b/x/123.jpg\" />\n<img src=\"server/b/x/真是难啊.jpg\" >";要求:查找出图片的名字,同时找出上级地址
限制:图片的名字可以是有效的名字,可以是汉字,某些名字中可以存在的特殊字符,不只局限于字母,下划线,数字
因为匹配的时候肯定是要使用非贪婪模式匹配,但是我的实现很郁闷,只能找出一级地址,想了很多方法,查了很多资料,都没有完成要求。
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test {
public static void main(String[] args) {
String str = "<img src=\"/y/186.png\"/>.......................<img src=\"server/b/x/123.jpg\" />\n<img src=\"server/b/x/真是难啊.jpg\" >";
Pattern pattern = Pattern.compile("<img src=\"([^/]*/)+?([^\\.]+\\.[^\"]+)\"(/| /| )?>");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1) + " : " + matcher.group(2)); // group1是上级地址,group2是图片的名字. 我的实现是错误的,*^_^*
}
}
}
String str = "<img src=\"/y/186.png\"/>.......................<img src=\"server/b/x/123.jpg\" />\n<img src=\"server/b/x/真是难啊.jpg\" >";要求:查找出图片的名字,同时找出上级地址
限制:图片的名字可以是有效的名字,可以是汉字,某些名字中可以存在的特殊字符,不只局限于字母,下划线,数字
因为匹配的时候肯定是要使用非贪婪模式匹配,但是我的实现很郁闷,只能找出一级地址,想了很多方法,查了很多资料,都没有完成要求。
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test {
public static void main(String[] args) {
String str = "<img src=\"/y/186.png\"/>.......................<img src=\"server/b/x/123.jpg\" />\n<img src=\"server/b/x/真是难啊.jpg\" >";
Pattern pattern = Pattern.compile("<img src=\"([^/]*/)+?([^\\.]+\\.[^\"]+)\"(/| /| )?>");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1) + " : " + matcher.group(2)); // group1是上级地址,group2是图片的名字. 我的实现是错误的,*^_^*
}
}
}
server/b/x 这个是上级地址?
/ : y/186.png
server/ : b/x/123.jpg
server/ : b/x/真是难啊.jpg
而图片的种类无非jpg,png,gif,jpeg几种,图片的名字里也是不可能包含/的
写个方法传图片地址进去用截字符串的方式返回图片名字和上级地址应该也不困难
如果只是功能需求 不是一定要用正则优美实现的话可以考虑下
^_^,正巧我也要使用这个正则在php里使用preg_replace函数把上一级目录换成一个标志符,所以要这样的表达式。
在Java中可以是可以先提取出图片的整个地址,这个使用非贪婪匹配简单得多,再分析出名字与上一级地址。
其实我就是想走个捷径,用一个正则搞定。
当然,php里也可以这样分步做,因为php的preg_replace支持数组
package test3;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test {
public static void main(String[] args) {
String str = "<img src=\"/y/186.png\"/>.......................<img src=\"server/b/x/123.jpg\" />\n<img src=\"server/b/x/真是难啊.jpg\" >";
Pattern pattern = Pattern
.compile("<img src=\"(([^/]*/(?!>))+)([^\\.]+\\.[^\"]+)\"(/| /| )?>");
Matcher matcher = pattern.matcher(str); while (matcher.find()) {
System.out.println(matcher.group(1) + " : " + matcher.group(3)); // group1是上级地址,group2是图片的名字. 我的实现是错误的,*^_^*
}
}
}
/y/ : 186.png
server/b/x/ : 123.jpg
server/b/x/ : 真是难啊.jpg是这样吗,没用非贪婪匹配,就是普通的贪婪匹配