Java 从字符串中提取文本

Java 从字符串中提取文本,java,regex,pattern-matching,Java,Regex,Pattern Matching,我有下面的字符串,它是HTML- <html> <head> <title>Repository</title> </head> <body> <h2>Subversion</h2> <ul> <li> <a href="../">..&l

我有下面的字符串,它是HTML-

<html>
    <head>
        <title>Repository</title>
    </head>
    <body>
        <h2>Subversion</h2>
        <ul>
            <li>
                <a href="../">..</a>
            </li>
            <li>
                <a href="branch_A/">branch_A</a>
            </li>
            <li>
                <a href="branch_B/">branch_B</a>
            </li>
        </ul>
    </body>
</html>

存储库
颠覆
从中我想得到
li
标签,它们是
branch\u A
branch\u B
li
的计数可能会有所不同。我想把它们都买下来。你能帮我解析这个字符串并得到那些值吗


注意我本可以使用
jsoup
库来实现同样的效果,但考虑到我们的项目限制,我不能使用它。

您可以使用HTML解析器来实现这一点。在下面的代码中,使用了jsoup(),并且它快速而简单

   Document doc = Jsoup.connect(fix url here).get();
   doc.select(tag you want).forEach(System.out::println);
这里讨论了其他工具:

使用Java 8流:

    String html = "<html>\n" +
    "    <head>\n" +
    "        <title>Repository</title>\n" +
    "    </head>\n" +
    "    <body>\n" +
    "        <h2>Subversion</h2>\n" +
    "        <ul>\n" +
    "            <li>\n" +
    "                <a href=\"../\">..</a>\n" +
    "            </li>\n" +
    "            <li>\n" +
    "                <a href=\"branch_A/\">branch_A</a>\n" +
    "            </li>\n" +
    "            <li>\n" +
    "                <a href=\"branch_B/\">branch_B</a>\n" +
    "            </li>\n" +
    "        </ul>\n" +
    "    </body>\n" +
    "</html>";

html.lines().filter(line -> line.contains("<a href")).forEach(System.out::println);

我确信Java中有HTML解析器。不要使用正则表达式。请参阅使用类似的HTML解析器。是的,这是可用的,但由于使用外部库的限制,我无法使用它。让我补充一下这个问题。使用正则表达式和字符串会很麻烦,但是如果你只是出于好奇而不得不这么做,你有什么理由应该这样做吗?可能是因为它是为了学校或一些编码挑战网站(不坏的原因),也可能是因为一些非技术性的经理,他们对一些他们显然缺乏知识的东西有很好的想法。如果字符串包含
,如果我在HTML标记和它的属性之间定义了新行,我会感到惊讶。我可能会发生,但并不常见。此解决方案旨在解决特定问题,如果您想要更通用的解决方案,可以使用Jsoup。您可以使用筛选函数根据您提供的谓词删除不希望包含在最终结果中的元素。问题:“注意,我本可以使用jsoup库来实现同样的功能,但考虑到我们的项目限制,我不能使用它。”
            <a href="../">..</a>
            <a href="branch_A/">branch_A</a>
            <a href="branch_B/">branch_B</a>
html.lines().filter(line -> line.contains("<a href")).map(line -> line.replaceAll("<[^>]*>","")).forEach(System.out::println);
            branch_A
            ..
            branch_B