请帮我拿回这个值

时间:2011-08-29 12:01:08

标签: java html regex

我知道使用正则表达式不是在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();

}

4 个答案:

答案 0 :(得分:2)

matcher.toString()没有进行搜索。使用matcher.find()matcher.matches()

以下是如何使用PatternMatcher的官方示例。

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);
}

注意:我没有运行它,因此可能存在拼写错误。随意纠正它们(并删除此注释)。