Java正则表达式匹配问题

时间:2010-04-04 04:12:47

标签: java regex

如何匹配这样的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();
    }

2 个答案:

答案 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)"