2012-02-27 11 views
1

からリンクを抽出し、私はgetContentAsString()に次のコードJavaの正規表現 - HTMLアンカー

private String anchorRegex = "\\<\\s*?a\\s+.*?href\\s*?=\\s*?([^\\s]*?).*?\\>"; 
private Pattern anchorPattern = Pattern.compile(anchorRegex, Pattern.CASE_INSENSITIVE); 
String content = getContentAsString(); 
Matcher matcher = anchorPattern.matcher(content); 

while(matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

電話を持っているWebページからHTMLコンテンツを返します。私が持っている問題は、System.outで印刷されるのはスペースだけです。誰も私の正規表現で何が間違っているのを見ることができますか?

Regexは時々私を狂わせます。

+1

これは、これを行うために、悪い考えです: http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-notを –

+2

彼ではありません一般にHTMLにマッチする。 regexは、拘束されたユースケースではHTMLで問題ありません。 – beerbajay

答えて

1

キャプチャグループを次の.*?から区切る必要があります。そこhrefの周りに二重引用符"はおそらくですので、それらを使用します。

<\s*a\s+.*?href\s*=\s*"(\S*?)".*?> 

あなたの正規表現が含まれています

([^\s]*?).*? 

([^\s]*?)はしぶしぶすべての非空白文字を検索し、グループに保存すると言います。しかし、消極的な*?は次の部分に依存します。これは.です。任意の文字。したがって、最初の可能性のあるチャンスでhrefの一致が中止され、残りのURLと一致するのは.*?です。あなたが使用する必要があります

+0

私はそれについて考えましたが、私が見つけた問題は、サイトによってはhrefで一重引用符を使用する場合があり、一部引用符と二重引用符の両方を省略する場合もあります。 –

+0

単一引用符と二重引用符は簡単です。 '['']'を使いますが、サイトが他の属性から 'href'を区切っていない場合、地獄に行って、それらのデータやデータを気にするべきではありません。 href = a class = .html> 'ひどくフォーマットされたHTMLからの情報が本当に必要な場合は、正規表現以外のものを使うべきです。 – beerbajay

1

正規表現はこれです:

String anchorRegex = "(?s)<\\s*a\\s+.*?href\\s*=\\s*['\"]([^\\s>]*)['\"]"; 
0

これはあまり苦労せずHREFを引き出すことができるはずです。
リンクはキャプチャグループ2にあり、拡張されており、ドットオールを想定しています。
必要に応じてJavaデリミタを使用します。

(?s) 
<a 
    (?=\s) 
    (?:[^>"']|"[^"]*"|'[^']*')*? (?<=\s) href \s*=\s* (['"]) (.*?) \1 
    (?:".*?"|'.*?'|[^>]*?)+ 
> 

拡張されていないか、ドットオールではありません。

<a(?=\s)(?:[^>"']|"[^"]*"|'[^']*')*?(?<=\s)href\s*=\s*(['"])([\s\S]*?)\1(?:"[\s\S]*?"|'[\s\S]*?'|[^>]*?)+>