Удаление повторяющихся значений с помощью поиска и замены в текстовом редакторе - PullRequest
0 голосов
/ 06 июля 2011

Я что-то напутал. В моем XML каждый предпочтительный термин имеет предпочтительный термин для использования: Что-то, что я сделал, создало некоторые непредставленные термины, где предпочтительным термином для использования является то же самое имя, что и для этого не предпочтительного термина.

<term>
<termId>127699289611384833453kNgWuDxZEK37Lo4QVWZ</termId>
<termUpdate>Add</termUpdate>
<termName>Adenosquamous Carcinoma</termName>
<termType>Nd</termType>
<termStatus>Active</termStatus>
<termApproval>Approved</termApproval>
<termCreatedDate>20110704T09:41:31</termCreatedDatae>
<termCreatedBy>admin</termCreatedBy>
<termModifiedDate>20110704T09:45:17</termModifiedDate>
<termModifiedBy>admin</termModifiedBy>
<relation>
  <relationType>USE</relationType>
  <termId>1276992897N1537166632rbr7BISWAI93SarY118G</termId>
  <termName>Adenosquamous Carcinoma</termName>
</relation>

Существует ли текстовый редактор с функцией поиска и замены, который я могу использовать, чтобы сообщить ему, что если in = the фактического термина, просто удалить целое? Я посмотрел на связанные запросы, и они упомянули регулярные выражения, но я потратил целую вечность, пытаясь построить их, и они вне меня, спасибо!

1 Ответ

0 голосов
/ 25 мая 2014

Уже почти 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] можно также использовать другое определение класса или просто ., если точка не соответствует символам новой строки.Также возможно будет ([^<]+), если невозможно, чтобы не закодированная угловая скобка открытия была частью имени термина.Символ < должен быть закодирован с помощью &lt; в соответствии со спецификацией 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].

...