【问题标题】:Please help me get this return the values请帮我把这个返回值
【发布时间】:2011-08-29 12:01:07
【问题描述】:

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

}

【问题讨论】:

  • 您能否添加一些有关“如何”不起作用的详细信息?任何堆栈跟踪,或者只是没有结果,还是其他什么?
  • 您可以使用 XQuery 或 XPath 将文本节点(我假设您的意思是“非 HTML 内容”)与模式匹配。为此,XQuery 1.0 和 XPath 2.0 都支持正则表达式。也无需将 HTML 与正则表达式匹配。

标签: java html regex


【解决方案1】:

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

这里是如何使用PatternMatcher的官方示例。

http://download.oracle.com/javase/tutorial/essential/regex/matcher.html

【讨论】:

    【解决方案2】:

    我建议您首先在 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
    

    这似乎相当不错,不是吗?

    【讨论】:

      【解决方案3】:

      您似乎正在使用来自 PHP 背景的正则表达式 - 如果您想在 Java 中使用正则表达式,则需要删除它周围的分隔符(斜杠):

      String searchFor = "<" + tag + ">(.*?)</" + tag + ">";
      

      否则,您的正则表达式将在您的标签周围寻找可能不存在的文字斜杠。

      【讨论】:

      • 我认为他们的模式不会像&lt;ul&gt;&lt;ul&gt;...&lt;/ul&gt;&lt;/ul&gt; 这样的文本做他们希望它做的事情,因为它是第一个&lt;ul&gt;,然后是第一个&lt;/ul&gt;,而不是对应的.您无法在 Java 的简单正则表达式语言中正确地执行递归模式,但您可以排除括号。
      【解决方案4】:

      如果您进行这种简单的搜索并且无法找出自己的正则表达式,那么您就违反了 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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 2013-12-23
        • 1970-01-01
        • 2017-09-23
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多