Regex - соответствует ровно одному тегу - PullRequest
3 голосов
/ 23 апреля 2009

У меня есть регулярное выражение для извлечения текста из тега 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"

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

Ответы [ 4 ]

10 голосов
/ 23 апреля 2009

Вам нужно отключить жадное сопоставление с .*? вместо .*.

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

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

3 голосов
/ 23 апреля 2009

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

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

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

2 голосов
/ 23 апреля 2009

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

 <FONT FACE=\"Excelsior LT Std Bold\"(.*?)>(.*?)</FONT>
0 голосов
/ 22 января 2015
<FONT[^>]*Excelsior LT Std Bold[^>]*></FONT>

См. Пост Фила Хаака здесь .

Вот мое 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...