1

タイトル要素内のテキストを抽出し、それ以外はすべて無視しようとしています。

これらの記事を見てきましたが、役に立たないようです:\
角括弧の間にテキストを抽出する正規表現
Java Java Regexで文字列パターンマッチングを使用
して、HTMLアンカーからテキストを取得します(<a> ... </a >)タグ

主な問題は、自分のコードをハックしようとしているときに、レスポンダーが何を言っているのか理解できないことです。

これが、 Patternの記事でJavaAPIを読んで管理したものです。

<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>]山かっこまたは単語「タイトル」の文字である任意の 1 文字に一致します。

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

の方が優れていますが、1 行のタイトルにのみ一致します (.デフォルトでは、改行には一致せず、次のような小さなバリエーションには一致しません)。

<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 コードの 1 行だけでタイトルを取得します。

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

この正規表現は、HTML が「単純」であると想定しており、「DOTALL」スイッチ(?s)(ドットは改行文字にも一致することを意味します) を使用すると、複数行の入力や複数行のタイトルでも機能します。

于 2013-02-28T05:30:05.643 に答える