2012-03-16 5 views
1

안녕하세요, 문자열에서 URL을 찾으려면, 정규식을 사용하여 많은 주제를 발견했지만 문제가 있습니다. 이 패턴을 사용 :문자열에서 URL 찾기

String regex = "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + 
      "(\\w+:\\[email protected])?(([-\\w]+\\.)+(com|org|net|gov" + 
      "|mil|biz|info|mobi|name|aero|jobs|museum" + 
      "|travel|[a-z]{2}))(:[\\d]{1,5})?" + 
      "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + 
      "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
      "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + 
      "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
      "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + 
      "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"; 

대부분의 페이지에서 꽤 잘 작동하지만 다른 문제가 있습니다. 예를 들어 :

http://hello.com/hello world

반환

http://hello.com/hello

문제를 그 공간입니다.

누구나이 문제를 해결하는 멋진 패턴을 가지고 있습니까?

감사합니다.

편집이 ::이

private ArrayList<String> pullLinks(String text) { 
    ArrayList<String> links = new ArrayList<String>(); 

    String regex = "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + 
      "(\\w+:\\[email protected])?(([-\\w]+\\.)+(com|org|net|gov" + 
      "|mil|biz|info|mobi|name|aero|jobs|museum" + 
      "|travel|[a-z]{2}))(:[\\d]{1,5})?" + 
      "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + 
      "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
      "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + 
      "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
      "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + 
      "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"; 

    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(text); 
    while(m.find()) { 
    String urlStr = m.group(); 
    if (urlStr.startsWith("(") && urlStr.endsWith(")")) 
    { 
    urlStr = urlStr.substring(1, urlStr.length() - 1); 
    } 
    links.add(urlStr); 
    } 
    return links; 
    } 
+0

Offtopic : 더 많은 최상위 수준의 TLD가 2 글자 이상으로 나열되어 있습니다. [Wikipedia TLD 목록] (http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains)을 확인하십시오. 또한 regexp는'example.com'과 같이 쓰여진 URL을 놓칠 것이다. –

+0

Offtopic,하지만 여기에 일치하는 URL에 대한 좋은 패턴, 행별로 설명 : http://daringfireball.net/2010/07/improved_regex_for_matching_urls – Holm

답변

4

공간의 URL에서 허용되지 않습니다 내 코드 (그들은 %20로 교체해야합니다). 이 질문에 인스턴스에 대한 답변을 참조하십시오 : 당신이 URL은 어쨌든 공백을 포함 할 수 있다면, 어떻게 예를 http://www.google.com/ig is a nice webpage에 대한

해석 할 것인가? 분명히 /ig 이후의 부품은 포함되지 않아야합니다!

+0

% 20의 URL을 감지 할 수있는 방법이 없습니까? –

+0

물론 있습니다. 당신이 이미 가지고있는 표현. 예를 들어,'% [a-f \\ d] {2}'(''% '다음에'a-f' 또는 숫자 인'{2}'문자가옵니다)를 찾습니다. – aioobe

+0

이것이 나를 위해 작동하지 않습니다. 내 코드로 질문을 편집하십시오. 덕분에 –

0

공백은 유효한 URL 문자가 아닙니다.

또한 공백 문자를 종결 자로 사용하지 않으면 URL 끝을 어떻게 알 수 있습니까?

정규 표현식은 .int와 같은 다른 최상위 도메인도 고려하지 않습니다. 유효한 URL을 구성 할 필요가 없으므로 특정 TLD를 왜 찾고 있는지 실제로 확신 할 수는 없습니다.

+0

나에게 문제가되지 않는 .int 또는 다른 것들. 내 URL은 항상 다음과 같습니다. http://something.es/some some.jpg –