我搞砸了什么。在我的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 =实际术语,只删除整个?我查看了相关的查询,他们提到了正则表达式,但我花了很多时间尝试构建它们并且它们超出了我的范围, 谢谢!
答案 0 :(得分:0)
回答这个问题已经快3年了,但是Perl正则表达式确实可以用于此任务。
使用UltraEdit for Windows v21.10.0.1032查找和删除term
中termName
的{{1}}块,如上所述,对于该术语本身是可行的,并且很可能也与其他文本编辑器使用区分大小写的Perl正则表达式支持Perl正则表达式替换为搜索字符串:
relation
替换字符串是一个空字符串。
说明:
^[ \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
...在一行的开头开始每次搜索。
^
...行的开头可以有0个或更多空格或制表符。
[ \t]*
...必须在该行旁边找到此字符串。
接下来需要使用棘手的表达式来匹配任何字符到下一个感兴趣的字符串,但是如果剩下的表达式没有在当前{{1}上返回正结果,则避免匹配下一个<term>
块中的某些内容阻止。
term
...此表达式查找任何字符,因为term
匹配任何非空白字符或任何空白字符。由于(?:(?!</term>)[\S\s])+
,下一个固定字符串之前必须至少有一个字符,但它也可以是更多字符。此外,Perl正则表达式必须在匹配的每个字符上向前看,以检查是否跟随[\S\s]
。如果当前匹配的字符右侧有字符串+
,则Perl regexp引擎必须停止匹配流中当前位置的任何字符,并继续搜索字符串的下一部分。因此,此表达式可以匹配任何字符,但不能超过</term>
,因此只能匹配</term>
和</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>
...匹配0个或更多空格,制表符和回车符以及下一个换行符。因此,此表达式适用于DOS / Windows(CR + LF)和Unix(仅LF)文本文件。
UltraEdit也可以:
term
[ \t\r]*\n
...此搜索字符串开头的表达式将(?s)^[ \t]*<term>(?:(?!</term>).)+<termName>([^<]+?)</termName>(?:(?!</term>).)+<relation>(?:(?!</term>).)+<termName>\1</termName>(?:(?!</term>).)+</term>[ \t\r]*\n
的行为从匹配除行终止符之外的任何字符改为实际上任何字符,因此(?s)
现在就像{ {1}}。