如何匹配这样的URL字符串:
img src =“https://stackoverflow.com/a/b/c/d/someimage.jpg”
只有域名和文件扩展名(jpg)是固定的,而其他是变量?
以下代码似乎不起作用:
Pattern p = Pattern.compile("<img src=\"http://stachoverflow.com/.*jpg");
// Create a matcher with an input string
Matcher m = p.matcher(url);
while (m.find()) {
String s = m.toString();
}
答案 0 :(得分:2)
正则表达式匹配您提供的示例字符串存在一些问题。不过你很亲密。这是您的代码已修复以使其正常工作:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TCPChat {
static public void main(String[] args) {
String url = "<img src=\"http://stackoverflow.com/a/b/c/d/someimage.jpg\">";
Pattern p = Pattern.compile("<img src=\"http://stackoverflow.com/.*jpg\">");
// Create a matcher with an input string
Matcher m = p.matcher(url);
while (m.find()) {
String s = m.toString();
System.out.println(s);
}
}
}
答案 1 :(得分:1)
首先,我会使用group()
方法检索匹配的文本,而不是toString()
。但它可能只是你想要的URL部分,所以我会使用括号捕获该部分并调用group(1)
来检索它。
其次,我不认为src
是<img>
标记中的第一个属性。例如,在SO上,它通常以class
属性开头。您希望添加一些内容以匹配干预属性,但要确保它不能超出标记的末尾。 [^<>]+
可能就足够了。
第三,我会使用比.*
更严格的限制来将未知部分与路径相匹配。您总是有可能在一行中找到两个网址,例如:
<img src="http://so.com/foo.jpg"> blah <img src="http://so.com/bar.jpg">
在这种情况下,你的正则表达式中的.*
会缩小差距,给你一个你想要两个匹配的匹配。同样,[^<>]*
可能会有足够的限制。
还有其他一些潜在的问题。属性值是否始终用双引号括起来,还是单引号或根本不引用? =
周围会有空格吗?元素和属性名称是否总是小写?
......我可以继续正如已经多次在SO上指出的那样,正则表达式并不是使用HTML的正确工具。他们通常可以处理像这样的简单任务,但是了解它们的局限性是必不可少的。
这是我的正则表达式的修订版本(作为Java字符串文字):
"(?i)<img[^<>]+src\\s*=\\s*[\"']?(http://stackoverflow\\.com/[^<>]+\\.jpg)"