2011-07-06 4 views
0

나는 뭔가를 엉망으로 만들었습니다. 내 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> 

나는의 경우 = 실제 임기는 단지 전체를 삭제할 수 있음을 이야기하는 데 사용할 수있는 기능 검색 (find)와 텍스트 편집기가 있습니까 및 교체? 관련 검색어를 살펴 보았지만 정규 표현식에 대해 언급했지만 나이를 들여서 만들려고 노력한 결과 나를 뛰어 넘었습니다. 감사합니다!

+0

글을 지금 3 번 읽으면 내가 성취하고자하는 것을 얻지 못합니다. "사후"목록을 추가 할 수 있습니까? 어떤 OS를 사용하고 있습니까? "in = the 부분이 나를 혼란스럽게한다면 ..." –

+0

죄송합니다. 비 선호 용어는 다른 이름을 갖는 선호 용어를 제안해야합니다. 에서이 작업을 수행 한 다음 사용할 기본 용어의 ID와 이름을 지정합니다. 위의 예에서 xml은 선호하는 용어에 대해 선호하지 않는 용어와 동일한 이름을 사용하도록 시스템에 지시합니다. 그래서 찾기와 바꾸기가 끝나고,이 두 속성의 값이 같은 곳을 찾고, 그 곳에서 전체 용어를 삭제하십시오. 위의 예에서 전체 용어가 삭제됩니다. relation의 termName 값이 다른 경우 아무 것도 변경되지 않습니다. – Charlie

+0

필요하면 Mac을 사용할 수 있지만 창문이 있습니다. 그래서 위의 경우 relation의 termName이 의 termName이므로 전체가 축소됩니다. 서로 다르다면 아무 것도 바뀌지 않을 것입니다. – Charlie

답변

0

이 질문에 답하기에는 거의 3 년이 지났지 만 실제로이 작업에 사용할 수있는 펄 정규 표현식이 있습니다.

검색 및 용어는 그 자체가 다른 텍스트 편집기는 사용 펄 정규식과 지원 가능성도 윈도우 v21.10.0.1032위한 UltraEdit는 가능하고 대해 상기 정의한 바와 relation 동일 termName 함유 term 블록을 삭제하는 경우를 구분 펄 정규 표현식 검색 문자열로 바꾸기 :

^[ \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 정규식은 </term>이 나오지 않는지 확인하기 위해 일치하는 모든 문자를 미리 봐야합니다. 현재 일치하는 문자의 오른쪽에 문자열 </term>이 있으면 Perl 정규 표현식 엔진은 stream의 현재 위치에있는 문자와 일치하지 않게하고 검색 문자열의 다음 부분으로 계속 진행해야합니다. 따라서이 표현식은 어떤 문자와도 일치 할 수 있지만 </term>을 초과하지 않으며 따라서 <term></term> 사이의 문자 만 일치 할 수 없습니다. ?: 때문에이 표현식을 역 참조하기 위해 캡처되거나 표시되지 않은 항목은 없습니다.

<termName> ... term 블록 내의 고정 된 문자열을 다음에 찾아야합니다.

([^\r\n]+?) ... 용어의 이름과 일치하고 역 참조를 위해이 문자열을 캡처/표시합니다.음수 문자 클래스 표현식 [^\r\n] 대신 다른 클래스 정의를 사용하거나 도트가 줄 바꿈 문자와 일치하지 않는 경우에만 .을 사용할 수도 있습니다. 또한 인코딩되지 않은 여는 괄호가 용어 이름에 포함될 수 없다면 ([^<]+)이 가능합니다. 문자 <은 CDATA 블록을 제외하고 요소 값 내에서 XML 사양에 따라 &lt;으로 인코딩되어야합니다.

</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) 및 유닉스 (LF 만) 텍스트 파일에서 작동합니다. UltraEdit는와 수 또한

은 다음과 같습니다

(?s)^[ \t]*<term>(?:(?!</term>).)+<termName>([^<]+?)</termName>(?:(?!</term>).)+<relation>(?:(?!</term>).)+<termName>\1</termName>(?:(?!</term>).)+</term>[ \t\r]*\n 

(?s)가 ... 검색 문자열의 시작 부분에서이 표현은 줄 끝 정말 모든 문자를 제외한 모든 문자와 일치에서 .의 동작을 변경하기 때문에 . 지금 [\S\s]입니다.

관련 문제