[regex] vim에서 어떻게 매치를 욕심없이 만들 수 있습니까?

다음과 같은 마크 업이 많은 큰 HTML 파일이 있습니다.

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

모든 것을 제거하기 위해 Vim 검색 및 교체를 시도 class=""하고 style=""있지만 일치하지 않는 일치하는 데 어려움을 겪고 있습니다.

나의 첫번째 시도는 이것이었다

%s/style=".*?"//g

하지만 Vim은을 좋아하지 않는 것 같습니다 ?. 불행히도를 제거하면 ?경기가 너무 욕심이됩니다.

내 성냥을 어떻게 불쾌하게 만들 수 있습니까?



답변

대신에 .*사용 .\{-}.

%s/style=".\{-}"//g

또한 참조 :help non-greedy


답변

vim에서 욕심없는 검색은 {-} 연산자를 사용하여 수행됩니다. 이처럼 :

%s/style=".\{-}"//g

단지 시도:

:help non-greedy


답변

무슨 일이야

%s/style="[^"]*"//g


답변

PCRE 정규식 구문이 더 편하다면

  1. OP에서 요청한 것처럼 욕심없는 연산자?를 지원합니다. 과
  2. backwhacking 그룹화 및 카디널리티 연산자가 필요하지 않습니다 (리터럴 문자와 일치하지 않고 연산자를 지정하기 때문에 완전히 직관적이지 않은 vim 구문 요구 사항). 과
  3. 펄 기능으로 컴파일 된 [g] vim이 있습니다.

    : 기능을 검사하고 검사합니다. + perl이 있다면 잘 가야합니다)

를 사용하여 검색 / 바꾸기

:perldo s///

예. img 태그에서 src 및 alt 속성을 교체하십시오.

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>


답변

이 유형의 질문에 대한 좋은 해결책은 다음과 같습니다.

: %! sed ...

(또는 원하는 경우 perl). IOW는 vim의 정규 표현식을 배우기보다는 이미 알고있는 도구를 사용합니다. 펄을 사용하면? 수정자는 일치하지 않는 작업을합니다.


답변

와 함께 \v(여러 의견에서 제안한 바와 같이)

:%s/\v(style|class)\=".{-}"//g


답변

플러그인 eregex.vim 은 Perl 스타일의 욕심없는 연산자 *?+?