정규식 매처를 욕심없이 만드는 방법?


20

파일의 텍스트를 대체하기 위해 정규식을 사용하려고합니다 (프로토콜 / 도메인 /으로 전체 URL을 대체하십시오).

:%s/\(https\?:\/\/.*?\/\).*/\1/gc

불행히도 수량 화기 .*?를 이스케이프하려고하더라도 문자열과 일치하지 ?않습니까? 욕심없는 정량자는 어떻게 vim에서 탈출해야합니까?


2
:help greedy올바른 도움말 주제로 이동했을 것입니다. :help regexpVim의 정규 표현식을 설명하는 데 도움이됩니다.
jamessan

답변:


27

Vim의 정규 표현식에는 탐욕스럽지 않은 버전의 연산자에 대한 특별한 구문이 있습니다 (성가 시지만 기억해야합니다) : http://vimregex.com/#Non-Greedy

욕심없는 버전은 *입니다 \{-}. 따라서 간단히 다음 .*.\{-}같이 바꾸십시오 .

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc

6

항상 문제를 두 단계로 나누는 것이 좋습니다.

/\v(https?):\/\/(.{-})\/.*        <-- Search
:%s,,Protocol:\1 - Domain:\2,g    <-- Substitution

매우 역동적 인 "\ v"를 사용하여 많은 백 슬래시를 피하고 대체의 마지막 검색을 참조하고 대체 구분 기호를 변경하십시오. 이러한 모든 변경 사항으로 인해 코드를 더 읽기 쉽게 만들 수 있습니다.

여기에 이미지 설명을 입력하십시오


2

또한 [^\]+/.탐욕을 방지하기 위해 사용할 수 있습니다 . [^/]"무엇이든 기대 /하고 일치한다는 것을 의미하며 , +한 번 이상 반복합니다 ..

:%s!\v^(https?)\://([^/]+)/.*$!Protocol:\1 \t Domain:\2!g

/정규식에 있으면 !분리 기호로 사용 하여 탈출 할 필요가 없습니다 /.

다음 URL이 있다고 가정 해 봅시다.

http://academy.mises.org/courses/econgd/
http://academy.mises.org/moodle/course/view.php?id=172
http://acmsel.safaribooksonline.com/book/-/9781449358204?bookview=overview
http://acmsel.safaribooksonline.com/home
http://acordes.lacuerda.net/bebo__cigala/lagrimas_negras-2.shtml
http://acordes.lacuerda.net/jose_antonio_labordeta/albada.shtml
http://anarchitext.wordpress.com/category/new-middle-east/
https://courses.edx.org/courses/course-v1%3ADelftX%2BFP101x%2B3T2015/wiki/DelftX.FP101x.3T2015/resources-and-links/
https://cseweb.ucsd.edu/classes/wi11/cse230/lectures.html
https://developer.mozilla.org/en-US/docs/CSS
https://developers.google.com/edu/python
https://developers.google.com/structured-data/testing-tool/

대체를 적용하면 다음과 같이됩니다.

Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:anarchitext.wordpress.com
Protocol:https   Domain:courses.edx.org
Protocol:https   Domain:cseweb.ucsd.edu
Protocol:https   Domain:developer.mozilla.org
Protocol:https   Domain:developers.google.com
Protocol:https   Domain:developers.google.com
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.