Регулярное выражение с Notepad ++ для поиска шаблона строки, исключающего подстроку

У меня есть документ со 100 тысячами строк html, заполненных тегами <tr> ... </tr>. где-то внутри каждого из этих многострочных наборов тегов есть элемент со словом «цель», кроме одного. Мне нужно найти длинную строку страницы, начинающуюся с <tr> и имеющую несколько символов перед конечным тегом </tr> и не имеющую экземпляра строки «цель» в этом наборе тегов. Я работаю с поиском Notepad++ v7 с Regex и соответствует новой строке. Сопоставить строку tr легко, выполнив поиск по <tr>(.*?)</tr> Это соответствует одному и только одному набору тегов со всем текстом между ними. Что я НЕ МОГУ сделать, так это найти выражение, которое находит эту строку, в которой нет «цели». Я пробовал <tr>(?!.*?"purpose")(.*?)</tr>, который найдет первую строку tr после последней, которая содержит «цель» (да, мне нужно включить кавычки) и множество вариантов, и прочитал отрицательное регулярное выражение, смотрите вперед и назад учебники, но безрезультатно. У меня много подобных проблем с этим отсутствующим текстом, поэтому заранее большое спасибо, если кто-то знает, как это сделать !!!


person Chris Morgan    schedule 18.06.2020    source источник
comment
Попробуйте <tr>((?!\bpurpose\b).)*?</tr>   -  person Nick    schedule 18.06.2020
comment
Спасибо за ответ Ник. Ответ @Somdudewillson сработал. Я предполагаю, что вариант границы слова \b будет полезен для некоторых других задач, которые у меня есть.   -  person Chris Morgan    schedule 18.06.2020


Ответы (1)


Это должно помочь:

<tr>((?!"purpose").)*?</tr>

Это, по сути,

  1. Находит открывающий тег и переходит к персонажу сразу после этого.
  2. Проверяет, чтобы убедиться, что он и последовательные символы не соответствуют «цели» (включая кавычки)
  3. Шагает вперед на один символ и, если он не достиг конечного тега, возвращается к 2.
  4. Останавливается на конечном теге.
person Somdudewillson    schedule 18.06.2020
comment
Ты гений. Оно работает! Но я не понимаю цели .)*? символов точно и почему это делает эту работу. . для любого символа, * для нескольких, и я действительно не понимаю, что такое ? делает в этом случае как практический вопрос. Что попытается сделать механизм регулярных выражений, если вы уберете один из этих трех? - person Chris Morgan; 18.06.2020
comment
Ну, почти. Я исправил отсутствующий раздел цели этой строки tr, повторил выражение, и он не нашел других. Большой. Перейдем к следующей проблеме с документом: отсутствует синтаксис в некоторых строках tr. Я взял то же выражение, заменил слово «назначение» синтаксис слова без каких-либо других изменений, и теперь, нажав «Найти», вы выбираете ВЕСЬ ДОКУМЕНТ. Документ даже не начинается и не заканчивается одним из этих тегов, поэтому я понятия не имею, почему он делает это последовательно. Помощь? - person Chris Morgan; 18.06.2020
comment
Дополнительная информация: в зависимости от отсутствующего термина иногда он находит эту строку тега по желанию, а иногда просто выбирает весь документ, даже когда ясно, что термин отсутствует (я могу подсчитать количество вхождений термина, и это меньше, чем количество наборов тегов tr.) Идея? - person Chris Morgan; 18.06.2020
comment
. выполняет шаг 3, продвигая регулярное выражение вперед на один символ. Знак * повторяет шаги 2 и 3, а знак ? проверяет, существует ли он вне этого цикла, и переходит к шагу 4, когда достигает конечного тега. - person Somdudewillson; 18.06.2020