无法弄清楚正则表达式问题

时间:2013-02-28 05:15:56

标签: java regex exception illegalstateexception

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

我看了这些文章,但似乎没有帮助:\
Regular expression to extract text between square brackets
String Pattern Matching In Java
Java Regex to get the text from HTML anchor (<a>...</a>) tags

主要问题是我无法理解响应者在试图破解我自己的代码时所说的内容。

以下是我在阅读Pattern article中的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();”

3 个答案:

答案 0 :(得分:3)

What are the pros and cons of the leading Java HTML parsers?列出了一堆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>

答案 1 :(得分: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);
        }

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

[^&gt;] * : - 除>之外的任何内容都可以接受。我们可以在标签中使用属性。

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

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

答案 2 :(得分:-1)

这只能在一行java代码中获得标题:

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

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