2012-01-10 4 views
2

문자열이 있다고 가정 해 봅시다.특정 패턴까지 문자열 일치

"hello world; some random text; foo;"

';'까지 모든 것을 어떻게 선택할 수 있습니까? 즉

나는 첫 번째 일치가되고 싶어요 : "hello world"

두 번째 경기가 될 " some random text"

등 내가 시도

일 :

string s = "hello world; some random text; foo;"; 
Regex r = new Regex(".+?;"); 
var match = r.Match(s); 

while(match.Success) 
{ 
    Console.WriteLine(match.Value.ToString()); 
    // first match is "hello world"!! but this turns out to be an infinite loop 
    match.NextMatch(); 
} 

I을 내가 Regex.Split() 메서드를 사용할 수 있다는 것을 알고 있지만이 기술을 사용하고 싶다 ... 내가 뭘 잘못하고 있니? match.NextMatch(); 메서드가 다음 경기를 반환하지 않는 이유는 무엇입니까?

+0

을 * "나는 내가'Regex.Split()'방법을 사용할 수 있습니다 알고 있지만 내가 intead이 기술을 사용하려면"* - 왜 ... 그래서, 휠씬 재발견하는 것보다 휠체어가 필요할 때, 그리고 휠씬 능률적 일 것입니다. – Yuck

+1

'내가 뭘 잘못하고 있니? '잘못된 기술을 사용하고 있습니다. 'Regex.Split'을 사용하십시오. 아니면이 간단한 예제에서'string.Split'을 사용하면됩니다. – vcsjones

+0

여러 일치를 찾으려는 더 긴 정규 표현식을 작성 중이기 때문입니다. 이 문제로 인해 정규 표현식의 중간에 붙어 있습니다 ... –

답변

5

나는 강력하게을 사용하면 표시된대로 Regex.Split을 사용하는 것이 좋습니다. 심지어이 간단한 예는 string.Split입니다.

하지만, 여전히 루프 어떤 이유를 사용하려는 경우, 당신은 같은 것을 할 수있는 : 당신의 구체적인 예와

string s = "hello world; some random text; foo;"; 
Regex r = new Regex(".+?;"); 
for (Match m = r.Match(s); m.Success; m = m.NextMatch()) 
{ 
    Console.WriteLine(m.Value); 
} 

문제는 NextMatch새로운 일치를 반환한다는 것입니다. 현재의 Match를 변경하지 않습니다. while 루프에서 match.NextMatch();에서 match = match.NextMatch();으로 변경하면 문제가 해결됩니다.

0

이 방법으로 문제가 해결 듯 :

string s = "hello world; some random text; foo;"; 
Regex r = new Regex(".*?;{1}"); 
var match = r.Match(s); 

while(match.Success) 
{ 
    Console.WriteLine(match.Value.ToString()); 
    // move match index to avoid getting the same match 
    match = r.Match(s, match.Index + match.Length); 
}