我知道使用正则表达式不是在Java中搜索HTML标记的最佳方法。但这是我正在进行的项目的第一步,我将不得不搜索非HTML内容。那么为什么以下代码不起作用呢?
public static String tagValue(String inHTML, String tag) throws DataNotFoundException
{
String value = null;
String searchFor = "/<" + tag + ">(.*?)<\\/" + tag + "\\>/";
Pattern pattern = Pattern.compile(searchFor);
Matcher matcher = pattern.matcher(inHTML);
return matcher.toString();
}
答案 0 :(得分:2)
matcher.toString()
没有进行搜索。使用matcher.find()
或matcher.matches()
以下是如何使用Pattern
和Matcher
的官方示例。
http://download.oracle.com/javase/tutorial/essential/regex/matcher.html
答案 1 :(得分:1)
我建议您首先在fex示例上尝试使用正则表达式,例如使用this online tester。
找到一个好的正则表达式后,可以在代码中引入它。
例如,以下正则表达式(已经过测试)
Regular Expression
Original Expression <([a-zA-Z]+)([^>]*)>(.*)</\1>
as a Java string "<([a-zA-Z]+)([^>]*)>(.*)</\\1>"
提供以下测试结果:
Target String group(0) group(1) group(2) group(3)
<b>text</b> <b>text</b> b text
<a href="pouet">link</a> <a href="pouet">link</a> a href="pouet" link
<footnote></footnote> <footnote></footnote> footnote
哪个好看,不是吗?
答案 2 :(得分:1)
您似乎正在使用来自PHP背景的正则表达式 - 如果您希望regex在Java中工作,则需要删除它周围的分隔符(斜杠):
String searchFor = "<" + tag + ">(.*?)</" + tag + ">";
否则你的正则表达式会在你的标签周围寻找字面斜线,而这些标签可能不存在。
答案 3 :(得分:0)
如果你这么简单的搜索并且无法弄清楚你自己的REGEX,那么你违反了KISS原则。试试这个:
public static String tagValue(String inHTML, String tag) throws DataNotFoundException {
int start = inHTML.first("<"+tag+">");
if(start < 0) throw DataNotFoundException("Couldn't find beginning "+tag+" tag.");
int end = inHtml.first("</"+tag+">", start);
if(end < 0) throw DataNotFoundException("Couldn't find ending "+tag+" tag.");
return intHTML.substring(start,end);
}
注意:我没有运行它,因此可能存在拼写错误。随意纠正它们(并删除此注释)。