2010-03-17 9 views
1

나는 Regex 결과에 당황 스럽다. (여전히 구문을 고심하려고한다.) 나는 http://regexpal.com/을 사용하여 나의 표현을 시험해 보았고, C#에서는 예상대로 작동하지 않았다. 내가 다시 <open>Text1 <open>Text 2 <open>Text 3...LookAhead Regex in .Net - 예기치 않은 결과

의 내가 이렇게 그러나 때 결과를 기대 <open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>

:의 입력 문자열에 (?=<open>).*?(?=</open>)

다음의 표현 - 여기

테스트입니다 C#에서는 첫 번째 일치 항목 만 반환합니다. <open>Text1

Regex에서 다섯 가지 '결과'를 모두 다시 얻으려면 어떻게해야합니까?

Regex exx = new Regex("(?=<open>).*?(?=</open>)", RegexOptions.IgnoreCase | RegexOptions.Singleline); 
    string input = "<open>Text 1</open> Text 2 <open> Text 3 </open> Text 4 <open> Text 5 </open>"; 
    string result = Regex.Match(input, exx.ToString(), exx.Options).ToString(); 
+0

거기서 3 개의 일치 항목 만 표시됩니다. – Joey

답변

1

사용 Regex.Matches 대신 Regex.Match.

검색 정규식 패턴과 일치 한 Match 객체로서 발생 제를 반환 문자열의 입력 문자열 : Regex.Match 상태의 문서로서

PS Home:> $s = '<open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>' 
PS Home:> $re = '(?=<open>).*?(?=</open>)' 
PS Home:> @([regex]::Match($s, $re)).Length 
1 
PS Home:> @([regex]::Matches($s, $re)).Length 
3 

. Regex.Matches에 대한 반면

:

는 정규 표현식의 모든 항목에 대한 입력 문자열을 검색하여 모든 성공적인 일치를 반환합니다.

참고 :는 당신이 여기에서하고있는 것은 매우 잘못된 것 같습니다. XML 또는 이와 유사한 언어를 다루는 경우 정규 표현식을 사용하여 구문 분석하지 마십시오. 중첩 된 구조가있는 get mad otherwise입니다.

+0

와우, 그거 쉽지, 고마워, 잘 했어! – AaronM

+0

그럴 경우 Johannes의 답변을 upvoting하고 받아 들임으로써 업보를 향상시킬 수 있습니다. (이 게시물 옆에있는 삼각형과 체크 상자를 참조하십시오.) –

+0

일치 옵션을 놓쳤습니다. 그 링크도 고맙습니다. 몇 가지 기본 HTML을 수행하고 있습니다. 구문 분석/근근이, 아무것도 너무 복잡한 (내 생각 ...) 내가 루프를 사용하여 바이트를 통해 문자열을 통해 trawling했지만 Regex 더 좋을 것 (그 확실히 많이 적은 코드!), 아픈 좋은 생각 – AaronM

0

일치하는 동영상의 시작 부분에 실제로 <open> (을)를 갖고 싶습니까? Lookbehind도 사용하지 않는 이유는 무엇입니까?

(?<=<open>).*?(?=</open>) 
+0

아, 좋은 지적이야. 내가 사용한 테스트 데이터는 좋지 않지만, 시작 태그를 구문 분석하는 실제 데이터가 도움이 될 수 있습니다.고마워, Regex는 모두 나에게 새로운지만 익숙해지기까지 약간 걸릴 것이다. 이제 요하네스가 나에게 다른 것을 보여주었습니다! – AaronM

관련 문제