2009-05-05 2 views
4

이건 나를 위해 진짜 머리 scratcher입니다 ....NET Regex는 코드에서 일치하지 않으며 모든 테스트 장치에서 작동합니다.

var matches = Regex.Matches("<p>test something<script language=\"javascript\">alert('hello');</script> and here's <b>bold</b> and <i>italic</i> and <a href=\"http://popw.com/\">link</a>.</p>", "</?(?!p|a|b|i)\b[^>]*>"); 

정규식은 p, a, b, 또는 i가 아닌 HTML 태그 (열거 나 닫음)를 캡처해야합니다. 나는 입력 문자열과 정규 표현식을 무수한 테스트 페이지에 꽂아 넣었고, 모두 스크립트 태그 (열기 및 닫기)를 일치로 반환합니다. 그러나 코드에서 절대적으로 작동하지 않습니다. matches 변수의 수는 0입니다.

엄청나게 분명한 것을 놓치고 있습니까?

답변

8

패턴 문자열에서 백 슬래시를 이스케이프하는 것을 잊었습니다.

"</?(?!p|a|b|i)\\b[^>]*>" 
+0

또는 C# 문자열 리터럴 표시기를 사용해야합니다. 이봐. @ "] *>" –

0

(?!)은 네가티브 미리보기입니다. 포함 된 패턴이 현재 위치에서 일치하지 않으면 0 문자를 찾습니다.

(?!p|a|b|i)\\b은 다음 문자를보고 p|a|b|i과 일치하는지 확인합니다. 일치하지 않으면 미리보기가 아무 것도 일치하지 않습니다. 포함 된 패턴이 일치하지 않으면 look-ahead가 성공하고 패턴의 다음 토큰을 동일한 위치에서 일치 시키려고 시도합니다. 이 경우 단어 경계.

@"</?(?!(?:p|a|b|i)\b)\w+[^>]*>" 

그것은 (?:p|a|b|i)\b 일치 뭔가를 앞서 보인다 : 당신이 원하는 무엇

은 아마이 같은 것입니다. 해당 패턴이 일치하지 않으면 look-ahead가 성공하고 적어도 하나의 단어 문자와 일치하며 그 뒤에는 임의의 숫자의 문자가 닫히고 ">"까지 일치합니다.

+0

아니, 솔직히 내가 원한 것은 내가 원한 것이고, 모든 단위 테스트를 통과했다. 방금 문자열 리터럴로 사용하지 않는 (또는 Guffa가 제안한 \을 이스케이프 처리하는) 바보 같은 실수를했습니다. –

관련 문제