2013-10-17 5 views
2

외부에서 작동합니다. http://gskinner.com에서 sme가 성공적으로 실행되는 동안 패턴이 C# 코드에서 일치하지 않는 이유를 알고 싶습니다. 패턴은 다음과 같습니다Regex는 C#

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$ 

가 나는 등

I 시도를 일치시킬 C# -

YoutubeVideoRegex = new Regex(@"^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$", RegexOptions.IgnoreCase); 

youtubeMatch = YoutubeVideoRegex.Match(url); 
if (youtubeMatch.Success) 
{ 
id = youtubeMatch.Groups[1].Value; // I want this     
} 

하지만 일치하지 않습니다. ? 어떤 도움을주십시오`

+1

.NET 정규식에서 슬래시 ('/') 문자를 이스케이프 할 필요가 없습니다. 특수하지 않습니다 (JavaScript와 같은 다른 언어는 정규식 리터럴을 구분하여 이스케이프해야 함). – Richard

+0

응답자 덕분에! 문자열이 http://www.youtube.com/watch?feature=player_detailpage&v=cQwNbSJgFbI 패턴과 일치하지 않는 경우 http://www.youtube.com/watch?v=cQwNbSJgFbI&feature=player_detailpage가 일치합니다. 이유가 뭐야? 나는 정규 표현가가 아니다. 그래서 pls 도움이됩니다. 위치 쿼리 문자열에 관계없이 id를 추출해야합니다. – Raman

+0

식의 조각 ('? = [^?] * v = \ w +)'은'v ='로 시작하는 후속 부분 만 일치하도록합니다. 단어가 뒤따 랐다. 어떻게 (? =) 작동하는지에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/az24scfc.aspx#grouping_constructs를 검토하는 것이 좋습니다. – BlueMonkMN

답변

3

모든 그룹을 캡처했습니다. 정의하지 않은 하위 그룹에 액세스하는 대신 youtubeMatch.ToString 또는 Groups [0]를 사용하여 자신이 원하는 것 (전체 일치?)을 가져올 수 있습니까?

편집

귀하의 표현은 내가 괄호의 마지막 세트에서 ?:을 제거 할 때 더 잘 작동하는 것 같다. 제 의견은 괄호로 둘러싸인 표현식이 ?:으로 시작하는 경우 명시 적으로 이 표현식을 그룹으로 캡처하도록 지정하고을 나타내지 않고 ?=으로 시작하는 경우 너비가 0 인 어설 션을 정의한다는 것입니다. 너비가 0이고, 분명히 아무것도 포착하지 않습니다. 식에서 괄호가 필요합니다. 실제로 을 수행하면 Groups이 채워지려고을 캡처합니다.

편집이

지금까지의 의견과 당신이 뭘하려는 건지 추측 일부를 기반으로, 여기에 업데이트 된 정규 표현식 그것을 증명하는 몇 가지 업데이트 된 코드입니다.

var re = new System.Text.RegularExpressions.Regex(
    @"^http:\/\/(?:www\.)?youtube.com\/watch\?[^?]*v=(\w+)\b[^\s?]*$", 
    System.Text.RegularExpressions.RegexOptions.IgnoreCase); 
var match = re.Match(textBox1.Text); 
if (match.Success) 
{ 
    textBox2.Text = match.Value; 

    if (match.Groups.Count > 1) 
     textBox3.Text = match.Groups[1].Value; 
    else 
     textBox3.Text = "Group missing"; 
} 
else 
{ 
    textBox2.Text = "(No match)"; 
    textBox3.Text = string.Empty; 
} 

TextBox2를 전체 일치하는 URL로 채워집니다 및 textBox3 그냥 "V"쿼리 매개 변수로 채워집니다 : 그것은 하나가 작동하지 않을 것이다 당신은 당신의 코멘트에 언급 된 2 개 URL을 사용할 수 있습니다.

+0

하하, 그게 그의 주된 이슈가 될 수도 있습니다. – Jonesopolis

+0

자세한 예제는 BluemonkMN에게 감사드립니다. – Raman

2

난 그냥 코드를 실행하고 HTTP를 사용하여 두 가지 예에 일치 ->http://www.youtube.com/watch?v=KsH63qJlIMM

하지만이 일에

http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports ->

www.youtube.com/watch?v=KsH63qJlIMM

분명히 정규 표현식에서 필요로하는 http:이 없습니다. 그걸 선택 이길 원하니?

그렇다면, 그냥합니다

^(http:\/\/)?(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$

을하며 잡고 그것을 잘 당신은 액세스 그룹 [1]에 노력하고 있지만, 정규 표현식이있다 것처럼 보이지 않는

관련 문제