正则表达式中的双引号

Posted

技术标签:

【中文标题】正则表达式中的双引号【英文标题】:Double quotes in Regular expression 【发布时间】:2011-09-15 06:35:48 【问题描述】:

如何使用正则表达式获取双引号内的字符串?

我有以下字符串:

<img src="http://yahoo.com/img1.jpg" >

我想在外面获取字符串http://yahoo.com/img1.jpg alt=""。 如何使用正则表达式做到这一点?

【问题讨论】:

您是否也一直想要拥有 alt 标签? 【参考方案1】:

我不知道你为什么也想要 alt 标签,但是这个正则表达式可以满足你的需求: 第 1 组是 url,第 2 组是 alt 标签。如果 img 和 src 之间可以有几个空格,并且 '=' 周围可以有空格,我可能会稍微修改一下正则表达式

Pattern p = Pattern.compile("<img src=\"([^\"]*)\" (alt=\"[^\"]*\")>");
Matcher m = 
    p.matcher("<img src=\"http://yahoo.com/img1.jpg\" alt=\"\"> " + 
    "<img src=\"http://yahoo.com/img2.jpg\" alt=\"\">");

while (m.find()) 
    System.out.println(m.group(1) + "  " + m.group(2));

输出:

http://yahoo.com/img1.jpg  
http://yahoo.com/img2.jpg  

【讨论】:

【参考方案2】:

你可以这样做:

Pattern p = Pattern.compile("<img src=\"(.*?)\".*?>");
Matcher m = p.matcher("<img src=\"http://yahoo.com/img1.jpg\" alt=\"\">");
if (m.find())
  System.out.println(m.group(1));

但是,如果您要解析 html,请考虑使用一些库:正则表达式不是解析 HTML 的好主意。我对jsoup 有很好的体验:这是一个例子:

String fragment = "<img src=\"http://yahoo.com/img1.jpg\" alt=\"\">";
Document doc = Jsoup.parseBodyFragment(fragment);
Element img = doc.select("img").first();
String src = img.attr("src");
System.out.println(src);

【讨论】:

模式在找&gt;的时候太贪心了 @Kaj:谢谢:) ...我也投票给你的答案,因为我看到你提供的正则表达式与alt=""部分匹配......我不知道为什么操作人员想要它。 @MarcoS 谢谢。我认为这是 OP 的错字,但他可能也想要 alt 标签的值。只需要等待,看看 OP 是否回答了我关于 alt 标签的问题。 @Kaj:我会说这是一个错字而不是类型:)【参考方案3】:

这应该可以完成工作:

String url = "";
Pattern p = Pattern.compile("(?<=src=\")[^\"]*(?=\")");
Matcher m = p.matcher("<img src=\"http://yahoo.com/img1.jpg\" alt=\"\">");
if (m.find())
    url = m.group());

解析器将获取每个字符 except " after src="before "

【讨论】:

我不知道如何阅读操作员的帖子,但他的示例表明他也想要 alt 标签。 (不知道为什么,也不知道他为什么也想要这个标签,而不仅仅是alt标签的值) @Kaj - 我明白了,但我跳过了那部分,因为 link urlalt 属性(xml 表示法中的名称和值)的混合闻起来像错字;)

以上是关于正则表达式中的双引号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式用于选择花括号内的双引号而忽略外部的引号

正则表达式在csv中找到缺少的双引号

正则表达式匹配(替换)跨度标签之间单词中所有出现的双引号

PHP正则表达式函数总结

正则表达式替换可能会或可能不会被引用的字符串

正则表达式 RegExp