2009-04-23 3 views
3

내가 HTML 글꼴 태그에서 텍스트를 추출하는 정규식이 :정규식 - 정확히 하나 개의 태그를 일치

<FONT FACE=\"Excelsior LT Std Bold\"(.*)>(.*)</FONT> 

좀 중첩 글꼴 태그가 될 때까지 잘 작동합니다. 대신 문자열을

<FONT FACE="Excelsior LT Std Bold">Fett</FONT> 

결과와 일치의

<FONT FACE="Excelsior LT Std Bold">Fett</FONT> + <U>Unterstrichen</U> + <FONT FACE="Excelsior LT Std Italic">Kursiv</FONT> und Normal 

<FONT FACE="Excelsior LT Std Bold">Fett</FONT> + <U>Unterstrichen</U> + <FONT FACE="Excelsior LT Std Italic" 

가 어떻게 첫 번째 태그를받을 수 있나요이다? HTML이 적용 처리하기 위해 정규식을 사용하는 방법에 대한

<FONT FACE=\"Excelsior LT Std Bold\"[^>]*>(.*?)</FONT> 
            ^^^^^ ^^^ 
             |  | 
    match any character except ">" --+  +--------+ 
                | 
    match anything, but only up to the next </FONT> --+ 

일반적인 경고 :

+0

현재 RegEx를 게시 하시겠습니까? – Seb

+1

첫 줄에 HTML로 가장합니다. @OlafK : 더 눈에 띄게하려면 정규식을 따옴표로 묶으시겠습니까? – Tomalak

답변

3

당신은 비 욕심 별을 사용해야합니다 당신은 안된다.

9

.* 대신 .*?과 일치하는 욕심을 조장해야합니다. BadAttribute="<FooBar>" 같은 속성이 어딘가에 <FONT> 태그에 대한 FACE 속성 이후에있을 경우이 실패합니다

<FONT FACE=\"Excelsior LT Std Bold\"([^>]*)>(.*?)</FONT> 

참고. 일치하는 두 그룹을 섞어서 속성에 </FONT>이 포함될 경우 완전히 엉망이 될 수 있습니다. 정규식은 일치하는 태그 나 따옴표를 셀 수 없으므로이 방법을 사용할 수 없습니다. 따라서 나는 Tomalak에 절대적으로 동의합니다. XML, HTML 및 다른 마크 업을 처리하기 위해 정규 표현식을 사용하는 것을 피하십시오.

2

'?'로 표시된 욕심이없는 캡처를 사용해야합니다.

<FONT FACE=\"Excelsior LT Std Bold\"(.*?)>(.*?)</FONT> 
0
<FONT[^>]*Excelsior LT Std Bold[^>]*></FONT> 

참조 필 Haack의 게시물 here.

다음은이 표현식의 C# 사용법입니다. HTTP 응답에서 특정 CSS 및 JS 파일을 제거하는 데 사용되었습니다.

const string CSSFormat = "<link[^>]*{0}[^>]*css[^>]*>"; 
const string JSFormat = "<script[^>]*{0}[^>]*js[^>]*></script>"; 

static readonly Regex OverrideCss = new Regex(string.Format(CSSFormat, "override-"), RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline); 
static readonly Regex OverrideIconsJs = new Regex(string.Format(JSFormat, "overrideicons"), RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);