이 질문에 답하기에는 거의 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 사양에 따라 <
으로 인코딩되어야합니다.
</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]
입니다.
글을 지금 3 번 읽으면 내가 성취하고자하는 것을 얻지 못합니다. "사후"목록을 추가 할 수 있습니까? 어떤 OS를 사용하고 있습니까? "in = the 부분이 나를 혼란스럽게한다면 ..." –
죄송합니다. 비 선호 용어는 다른 이름을 갖는 선호 용어를 제안해야합니다.에서이 작업을 수행 한 다음 사용할 기본 용어의 ID와 이름을 지정합니다. 위의 예에서 xml은 선호하는 용어에 대해 선호하지 않는 용어와 동일한 이름을 사용하도록 시스템에 지시합니다. 그래서 찾기와 바꾸기가 끝나고,이 두 속성의 값이 같은 곳을 찾고, 그 곳에서 전체 용어를 삭제하십시오. 위의 예에서 전체 용어가 삭제됩니다. relation의 termName 값이 다른 경우 아무 것도 변경되지 않습니다. –
Charlie
필요하면 Mac을 사용할 수 있지만 창문이 있습니다. 그래서 위의 경우 relation의 termName이의 termName이므로 전체가 축소됩니다. 서로 다르다면 아무 것도 바뀌지 않을 것입니다. –
Charlie