я хочу захватить все теги, не имеющие определенного тега - PullRequest
1 голос
/ 25 июня 2009

я хочу захватить все теги с именем 'STRONG', я могу использовать <STRONG.*?</STRONG> это работает просто отлично, но я не хочу захватывать эти теги, если теги 'SPAN' входят в эти теги, я хочу что-то вроде <STRONG.*(^(SPAN)).*?</STRONG> это образец текста

<STRONG> For technical <SPAN id=PageBreak>101</SPAN> please</STRONG>
<SPAN id=PageBreak type="4">56</SPAN><STRONG> visit</STRONG>

я хочу захватить второй сильный тег, а не первый

Ответы [ 4 ]

5 голосов
/ 25 июня 2009

Вы пытаетесь проанализировать структуру HTML с помощью регулярного выражения, которое обречено на провал, поскольку язык HTML не является регулярным (см. иерархия формальных языков ).

Вместо этого используйте HTML-анализатор, например, HTML-пакет Agility Pack . См. Также эти другие вопросы .

3 голосов
/ 25 июня 2009

Конрад прав.

Но в случае, если вас не волнует неизбежная гибель, вы можете попробовать что-то вроде

/<STRONG>\w+?<\/STRONG>/

, который будет игнорировать теги STRONG, если они заключают в себе все, что не является символом слова, например '<' из '<SPAN>', но, без сомнения, потерпит неудачу для чего-то необычного ... возвращаясь к сути об обреченной попытке.

2 голосов
/ 25 июня 2009

Это типичный вариант использования для XPath . Запрос может быть, например:

**/strong[not(child::span)]/text()
0 голосов
/ 25 июня 2009

Если вы просто хотите узнать в общем, как сопоставить текст, который не содержит определенной последовательности символов, вот наиболее распространенный способ:

Regex re = new Regex(@"<STRONG(?:(?!<SPAN).)*?</STRONG>",
    RegexOptions.IgnoreCase | RegexOptions.Singleline);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...