2013-10-27 5 views
3

URL 파일을 구문 분석하여 호스트와 URI 부분을 가져 오지만 URL이 슬래시로 끝나지 않은 경우 버그가 있습니다.C# URL Regex 버그

C# 코드 :

var URL = Regex.Match(link, @"(?:.*?//)?(.*?)(/.*)", RegexOptions.IgnoreCase); 

입력 :

//cdn.sstatic.net/stackoverflow/img/favicon.ico 
/opensearch.xml 
http://stackoverflow.com/ 
http://careers.stackoverflow.com 

출력 : http://careers.stackoverflow.com :

//cdn.sstatic.net/stackoverflow/img/favicon.ico has 2 groups: 
    cdn.sstatic.net 
    /stackoverflow/img/favicon.ico 

/opensearch.xml has 2 groups: 

    /opensearch.xml 

http://stackoverflow.com/ has 2 groups: 
    stackoverflow.com 
    /
http://careers.stackoverflow.com has 2 groups: 
    http: 
    //careers.stackoverflow.com 

출력의 모든 URL가 exept 유효합니다. 어떻게하면 "슬래시가 있다면, 처음에 멈추고 모든 것을 잡아라"와 같은 가변 부분을 확인할 수 있습니다.

답변

1

마지막 그룹에 |$을 추가하여 해당 텍스트와 일치 시키거나 표현식의 끝과 일치시킵니다.

이것은 당신의 입력에 대해 작동합니다

var links = new[] 
    { 
     "//cdn.sstatic.net/stackoverflow/img/favicon.ico", 
     "/opensearch.xml", 
     "http://stackoverflow.com/", 
     "http://careers.stackoverflow.com" 
    }; 

foreach (string link in links) 
{ 
    var u = Regex.Match(link, @"(?:.*?//)?(.*?)(/.*|$)", RegexOptions.IgnoreCase); 
    Console.WriteLine(link); 
    Console.WriteLine(" " + u.Groups[1]); 
    Console.WriteLine(" " + u.Groups[2]); 
    Console.WriteLine(); 
} 

출력 :

//cdn.sstatic.net/stackoverflow/img/favicon.ico 
    cdn.sstatic.net 
    /stackoverflow/img/favicon.ico 

/opensearch.xml 

    /opensearch.xml 

http://stackoverflow.com/ 
    stackoverflow.com 
    /

http://careers.stackoverflow.com 
    careers.stackoverflow.com 
+0

와우, 작동! – Naster

-1

USR 당신이 Uri 클래스를 사용하는 것이 옳다하지만 Regex를 사용하여 주장하는 경우, 다음과 같이 제로 폭 긍정적 예측 주장을 사용해보십시오 :

var URL = Regex.Match(link, @"(?:.*?//)?(.*?(?=/|$))(/.*)", RegexOptions.IgnoreCase); 

자세한 내용에 :

http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#zerowidth_positive_lookahead_assertion

+0

'Uri' 클래스가 작동하지 않습니다. 이들은 유효한 Uris가 아닙니다. "System.UriFormatException : 잘못된 URI : URI 형식을 확인할 수 없습니다."생성합니다. –

+0

정규식이 작동하지 않습니다. 그룹 1에 대해서는 여전히'http :'를 만들고 그룹 2에 대해서는'//career.stackoverflow.com'을 생성합니다. –

1

그냥 다른 옵션

/(?:.+\/\/|\/\/)?([^\/]*)(\/.+)?/