2009-04-23 3 views
3

У меня есть регулярное выражение для извлечения текста из тега HTML шрифта:Regex - Одинаковые ровно один одиночный тег

<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" 

Как я могу получить только первый тег?

+0

Не могли бы вы предоставить вам текущий регекс? – Seb

+1

Он замаскирован под HTML в первой строке. @OlafK: Вы добавили бы регулярное выражение в кавычки, чтобы он выделялся больше? – Tomalak

ответ

3

Вы должны использовать нежадную звезду:

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

Обычных предупреждения об использовании регулярных выражений для обработки HTML применяются: Вы не должны.

9

Вам необходимо вывести жадкое соответствие с помощью .*? вместо .*.

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

Обратите внимание, что это не сработает, если есть атрибут как BadAttribute="<FooBar>" где-то после того, как атрибут FACE для <FONT> тега. Это будет смешивать обе сопоставимые группы, и он может полностью перепутаться, если атрибут будет содержать </FONT>. Это невозможно, потому что регулярные выражения не могут подсчитывать соответствующие теги или кавычки. Поэтому я абсолютно согласен с Tomalak - старайтесь избегать использования регулярных выражений для обработки XML, HTML и других разворотных языков, подобных этим.

2

вам нужно использовать не-жадный захват, обозначенный символом '?'

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

См Фил Хаак посткризисного here.

Вот мое использование C# этого выражения. Это было использовано для удаления определенных файлов CSS и JS из ответа HTTP.

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); 
Смежные вопросы