2012-02-27 2 views
1

에서 추출 링크는 다음 코드를자바 정규식 - 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)); 
} 

호출 getContentAsString()에 반환하는 웹 페이지에서 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]*?'|[^>]*?)+>