Регулярное выражение для соответствия строке таблицы HTML ( ‹tr› ), НЕ содержащей определенного значения

Я использую Notepad++ для очистки длинной и запутанной HTML-таблицы и пытаюсь использовать регулярные выражения.

Мне нужно удалить все строки таблицы, которые не содержат определенного значения (могу ли я назвать это подстрокой?).

После того, как все содержимое файла было развернуто, я смог использовать следующее регулярное выражение, чтобы выбрать одну за другой каждую строку таблицы со всем ее содержимым:

<tr>.+?</tr>

Как я могу улучшить регулярное выражение, чтобы выбирать и заменять только те строки таблицы, которые содержат где-то внутри <td> части определенную подстроку?

Я не знаю, имеет ли это значение, но структура каждой строки таблицы следующая (я поместил туда каждый HTML-тег, точки означают стандартный контент/значения)

<tr>
    <td> ... </td>
    <td> ... </td>
    <td> <a sfref="..." href="...">!! SUBSTRING I HAVE TO MATCH HERE !!</a> </td>
    <td> <img /> </td>
    <td> ... </td>
    <td> ... </td>
    <td> ... </td>
    <td> ... </td>
</tr>

person user1821136    schedule 13.11.2012    source источник
comment
Вы ищете конкретную строку (если вы не можете просто включить ее в свое регулярное выражение)? Или ищете какой-либо контент внутри тега привязки?   -  person mellamokb    schedule 13.11.2012
comment
Это 2012 год. Перестаньте пытаться анализировать HTML с помощью регулярных выражений. Используйте синтаксический анализатор XML.   -  person    schedule 13.11.2012
comment
Этот вопрос хорошо сформулирован. Я не думаю, что отрицательные голоса разумны, потому что сам вопрос в порядке.   -  person pimvdb    schedule 13.11.2012


Ответы (1)


Вам лучше написать небольшой скрипт на языке программирования, который содержит простой анализатор DOM, потому что ни одно решение для регулярных выражений не может быть идеальным.

Кроме того, ваш вопрос кажется мне несколько противоречивым. Сначала вы говорите, что хотите удалить все строки, которые не содержат определенную подстроку. Затем вы говорите, что хотите сопоставить все строки, которые соответствуют определенной подстроке.

Во всяком случае, вот импровизированное решение регулярного выражения для обоих случаев. Чтобы убедиться, что SUBSTRING встречается внутри строки, вам нужно использовать это:

<tr>((?!</tr>).)+?SUBSTRING.+?</tr>

(?!...) — это отрицательный прогноз. Он может не поддерживаться до Notepad++ 6, поэтому обязательно обновите его. Упреждающий просмотр гарантирует, что никогда не будет идти дальше конца одной строки таблицы, только чтобы найти SUBSTRING в следующей. Он делает это, утверждая для каждого отдельного символа в нашем повторении +?, что он не отмечает начало </tr>.

Чтобы убедиться, что SUBSTRING не встречается внутри строки, мы можем просто поместить SUBSTRING в тот отрицательный просмотр вперед, который у нас уже есть:

<tr>((?!SUBSTRING).)+?</tr>

Обратите внимание, что оба решения начнут рушиться, если у вас есть дополнительные пробелы в ваших тегах или атрибуты в открывающих тегах и тому подобные вещи. Вот почему настоятельно рекомендуется решение, использующее парсер DOM.

person Martin Ender    schedule 13.11.2012