2011-04-27 5 views
2

Regex.Matches를 사용하려고하는데 PHP와 같은 다른 언어와 다른 방식으로 작동하는 것 같습니다.# Regex.Matches 여러 일치 결과 문제

을 나는 특정 웹 페이지의 모든 형태를하고 싶지,하지만 난 다음

 String pattern = "(?i)<form[^<>]*>(.*)<\\/form>"; 
     MatchCollection matches = Regex.Matches(content, pattern); 

     foreach (Match myMatch in matches) 
     { 
      MessageBox.Show(myMatch.Result("$1")); 
     } 

을하려고 할 때이 코드가 비록 아무것도 표시되지 않습니다 : 여기에 는 내가 뭘하려고 오전입니다 해당 페이지에 세 가지 양식이 있습니다. (. *)를 사용하면 내용의 끝까지 모든 내용을 건너 뛰는 것 같습니다.

답변

0

은 정규식의 주요 부분에 대한이 같은 시도 :

String pattern = "<form[\\d\\D]*?</form>"; 

내가 현재 문서 중 특정 유형의 모든 태그를 제거하기 위해 사용하고 있지만를 찾는 잘해야 패턴은 양식 태그. 원하는 경우 \ d \ D 섹션을 변경할 수 있습니다.

+0

이것은 나를 위해 일했으나 여전히 트릭을 시도하지 않으면 C#이 모든 일치 대신 모든 것을 반환합니다 (단일 일치)는 여전히 이상합니다. – John

1

. 연산자 이 아닌은 기본적으로 \ r 및 \ n과 일치합니다. (더 정확하게, PCRE 및 .NET 또는)

MatchCollection matches = Regex.Matches(content, pattern, RegexOptions.Singleline); 
0
string pattern = @"(?is)<form[^<>]*>(.*?)</form>"; 

정규식은 PHP와 C#에서 동일하게 작동해야 :

MatchCollection matches = Regex.Matches(content, pattern); 

으로이 교체하십시오. 당신이?없이 PHP 에 최소한의 일치를 받고 있다면, 당신은 아마도 /U ("ungreedy") 옵션이 설정되어, 예를 들면 :

preg_match_all('~<form[^<>]*>(.*)</form>~isU', $subject, $matches); 

또는

preg_match_all('~(?isU)<form[^<>]*>(.*)</form>~', $subject, $matches); 

.NET에는 해당이 없습니다 PCRE의 ungreedy 모드.

+0

예, 저는 PHP에서 isU 옵션을 사용하고있었습니다. 설명해 주셔서 감사합니다. – John