1

我正在尝试提取标题元素中的文本并忽略其他所有内容。

我看过这些文章,但它们似乎没有帮助:\
正则表达式提取方括号之间的文本
Java Java 正则表达式中的字符串模式匹配以
从 HTML 锚 (<a>...</a >) 标签

主要问题是我在尝试破解我自己的代码时无法理解响应者在说什么。

这是我通过阅读Pattern 文章中的 Java API 所获得的。

<title>(.*?)</title>

这是我返回标题的代码。

String title = null;
Matcher match = Pattern.compile("[<title>](.*?)[</title>]").matcher(this.webPage);
try{
    title = match.group();
}
catch(IllegalStateException e)
{
    e.printStackTrace();
}

我收到了 IllegalStateException,它是这样说的:

java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:485)
    at java.util.regex.Matcher.group(Matcher.java:445)
    at BrowserModal.getWebPageTitle(BrowserModal.java:21)
    at BrowserTest.main(BrowserTest.java:7)

第 21 行将是“title = match.group();”

4

3 回答 3

3

领先的 Java HTML 解析器的优缺点是什么?列出了一堆 HTML 解析器。将您的 HTML 解析为 DOM,然后用于getElementsByClassName("title")获取标题元素,并通过查看应该是文本节点的子节点来获取文本内容。


title = match.group();

这是失败的,因为group()返回了整个匹配的文本。 group(1)将只返回第一个括号组的内容。


[<title>](.*?)[</title>]

方括号只是打破它。 [<title>]将匹配任何单个字符,即尖括号或单词“title”中的字母。

<title>(.*?)</title>

更好,但只会匹配一行中的标题(因为.默认情况下不匹配换行符,并且不会匹配诸如

<title lang=en>Foo</title>

它也将无法在 HTML 中正确找到标题,例如

<html>
<head>
<!-- <title>Old commented out title</title> -->
<title>Spiffy new title</title>
于 2013-02-28T05:18:38.050 回答
2

试试这个:-

        String title = null;
        String subjectString = "<title>TextWithinTags</title>";
        Pattern titleFinder = Pattern.compile("<title[^>]*>(.*?)</title>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
        Matcher regexMatcher = titleFinder.matcher(subjectString);
        while (regexMatcher.find()) {
            title = regexMatcher.group(1);
        }

编辑:- 正则表达式解释:-

[^>]* :- 任何东西>都可以接受。这是因为我们可以在标签中拥有属性。

(.*?) :-Dot表示除换行符以外的任何字符。*?表示重复任意次数,但尽可能少。

有关正则表达式的更多详细信息,请查看内容。

于 2013-02-28T05:21:47.713 回答
-1

这仅在一行 java 代码中获得了标题:

String title = html.replaceAll("(?s).*<title>(.*)</title>.*", "$1");

这个正则表达式假定 HTML 是“简单的”,并且使用“DOTALL”开关(?s)(这意味着点也匹配换行符),它将适用于多行输入,甚至是多行标题。

于 2013-02-28T05:30:05.643 回答