Уже почти 3 года слишком поздно, чтобы ответить на этот вопрос, но есть регулярные выражения Perl, которые действительно могут быть использованы для этой задачи.
Поиск и удаление блока term
, содержащего тот же termName
в relation
, как определено выше для самого термина, возможно с UltraEdit для Windows v21.10.0.1032 и, скорее всего, также с другими текстовыми редакторами, поддерживающими регулярное выражение Perl с использованием регулярного выражения Perl с учетом регистра. Заменить строкой поиска:
^[ \t]*<term>(?:(?!</term>)[\S\s])+<termName>([^\r\n]+?)</termName>(?:(?!</term>)[\S\s])+<relation>(?:(?!</term>)[\S\s])+<termName>\1</termName>(?:(?!</term>)[\S\s])+</term>[ \t\r]*\n
Заменяющая строка является пустой строкой.
Объяснение:
^
... начинать каждый поиск в начале строки.
[ \t]*
... в начале строки может быть 0 или более пробелов или табуляций.
<term>
... эта строка должна быть найдена следующей в строке.
Далее следует хитрое выражениеследует, что требуется для соответствия любого символа до следующей интересующей строки, но при этом избегать сопоставления чего-либо в следующем блоке term
, если оставшееся выражение не возвращает положительное значениерезультат для текущего term
блока.
(?:(?!</term>)[\S\s])+
... это выражение находит любой символ, поскольку [\S\s]
соответствует любому непробельному символу или любому пробелу.Должен быть как минимум 1 символ перед следующей фиксированной строкой из-за +
, но это может быть также больше символов.Кроме того, регулярное выражение Perl должно смотреть вперед на каждый соответствующий символ, чтобы проверить, следует ли NOT </term>
.Если справа от текущего совпавшего символа есть строка </term>
, механизм регулярных выражений Perl должен прекратить сопоставление любого символа в текущей позиции в потоке и перейти к следующей части строки поиска.Таким образом, это выражение может соответствовать любому символу, но не более </term>
и, следовательно, только символам от <term>
до </term>
.Из-за ?:
ничего не фиксируется / не помечается для обратной ссылки этим выражением.
<termName>
... эта фиксированная строка в блоке term
должна быть найдена следующей.
([^\r\n]+?)
... соответствует символам имени термина и захватывает / помечает эту строку для обратной ссылки.Вместо выражения класса отрицательного символа [^\r\n]
можно также использовать другое определение класса или просто .
, если точка не соответствует символам новой строки.Также возможно будет ([^<]+)
, если невозможно, чтобы не закодированная угловая скобка открытия была частью имени термина.Символ <
должен быть закодирован с помощью <
в соответствии со спецификацией XML внутри значения элемента, за исключением блока CDATA.
</termName>
... эта фиксированная строка в блоке term
должна быть найдена следующей.
(?:(?!</term>)[\S\s])+
... снова любой символ в блоке term
до следующей фиксированной строки.
<relation>
... эта фиксированная строка в блоке term
должнабыть найденным следующим.
(?:(?!</term>)[\S\s])+
... снова любой символ в блоке term
до следующей фиксированной строки.
<termName>
... эта фиксированная строка в term
блок должен быть найден следующим.
\1
... это выражение обратно ссылается на захваченное / помеченное имя термина, и поэтому следующая строка должна совпадать с именем термина, определенного выше.
</termName>
... эта фиксированная строка в блоке term
должна быть найдена следующей.
(?:(?!</term>)[\S\s])+
... снова любой символ в блоке term
до следующей фиксированной строки.
</term>
... этот фиксированный конец маркировки строки блока term
должен быть найден следующим.
[ \t\r]*\n
... соответствует 0 или более пробелам, символам табуляции и возврата каретки и следующему переводу строки.Так что это выражение работает для текстового файла DOS / Windows (CR + LF) и Unix (только LF).
Также возможно с UltraEdit:
(?s)^[ \t]*<term>(?:(?!</term>).)+<termName>([^<]+?)</termName>(?:(?!</term>).)+<relation>(?:(?!</term>).)+<termName>\1</termName>(?:(?!</term>).)+</term>[ \t\r]*\n
(?s)
..Это выражение в начале строки поиска изменяет поведение .
с сопоставления любого символа, кроме терминаторов строки, с действительно любым символом, и поэтому .
теперь похоже на [\S\s]
.