【问题标题】:how to get "something" from <em>something</em> use java Regular expressions如何从 <em>something</em> 中获取“某物”使用 java 正则表达式
【发布时间】:2012-11-26 07:44:39
【问题描述】:

在下面,我需要得到:

String regex = "Item#: <em>.*</em>";
String content = "xxx Item#: <em>something</em> yyy";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content); 

if( matcher.find() ) {
    System.out.println(matcher.group());
}

它会打印出来:

Item#: <em>something</em>

但我只需要值“某物”。

我知道我可以使用 .substring(begin,end) 来获取值, 但是还有其他更优雅的方法吗?

【问题讨论】:

  • 除此之外,只需 "Item#: &lt;em&gt;(.*)&lt;/em&gt;" 添加括号。
  • @soulseekah 并使正则表达式不贪心Item#: &lt;em&gt;(.*?)&lt;/em&gt;
  • @jlordo 是的,非贪婪的效果要好得多:)
  • @soulseekah,这非常聪明,谢谢。我会试试的。

标签: java html regex


【解决方案1】:

它会打印整个字符串,因为您已经打印了它。 matcher.group() 打印完整的匹配。要获取匹配字符串的特定部分,您需要更改正则表达式以捕获组中标签之间的内容:-

String regex = "Item#: <em>(.*?)</em>";

此外,使用Reluctant 量词(.*?) 匹配遇到&lt;/em&gt; 之前的最少字符数。

然后在 if 中,打印 group(1) 而不是 group()

if( matcher.find() ) {
    System.out.println(matcher.group(1));
}

无论如何,您不应该使用Regex 来解析HTML。正则表达式不足以完成这项任务。您可能应该使用一些 HTML 解析器,例如 - HTML Cleaner。另请参阅 OP 中的 cmets 之一中提供的链接。那篇文章很好地解释了您可能面临的问题。

【讨论】:

  • 在这种情况下,勉强的量词会不会更安全? "Item#: &lt;em&gt;(.*?)&lt;/em&gt;"
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多