명령 태그를 변환하는 욕심없는 정규식


5

배경

다음 텍스트를 고려하십시오.

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use <cmd>rm</cmd> for
serif, <cmd>ss</cmd> for sans serif, and <cmd>tt</cmd> for teletype.

나는 변화시키고 싶다. <cmd>x</cmd>{{cmd|x}}, 다음과 같이 :

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

문제

비 욕심 많은 성냥에 대한 정규 표현식은 까다 롭습니다. 예를 들어, 다음은 vim에서 작동하지 않습니다 :

:%s/<cmd>\(.*\)<\/cmd>.\{-}/{{cmd|\1}}/

또한 sed와 함께 다음을 수행하지 않습니다.

sed -e "/(<cmd>\(.*\)</cmd>).\{-}/{{cmd|\1}}/"

괄호는 표현식을 그룹화하지 않고 괄호와 일치하도록 시도합니다. \{-} 또는 ?. 괄호를 이스케이프 처리하는 것은 역 참조를 위해 사용됩니다. <cmd> 꼬리표.

의문

모든 구문을 비 윤리적으로 바꿀 올바른 구문은 무엇입니까? <cmd>x</cmd>{{cmd|x}} 파일에?

참고 :이 정규식을 사용하여 HTML 구문 분석 시도가 아닙니다. ;-)

답변:


5

나는 VIM에서 이것을 시도했다 : %s/<cmd>\(.\{-}\)<\/cmd>/{{cmd|\1}}/g, 데모 텍스트를 다음과 같이 변환합니다.

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

VIM의 첫 번째 정규 표현식이 퍼즐을 풀기에 너무 가깝지만 사용법은 비슷합니다. .\{-} 올바른 위치에 있지 않습니다.

나는이 대답에서 힌트를 얻는다 : https://stackoverflow.com/questions/1305853/how-can-i-make-my-match-non-greedy-in-vim

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.