일치하는 짧은 일치를 선호하는 정규식? (이것은 탐욕스럽지 않은 것보다 더 관련이 있습니다)


9

버퍼 내에서 퍼지 검색을 수행하기위한 스크립트를 만들려고합니다. 주요 아이디어는 몇 가지 입력을 받아, 삽입하는 .\{-}캐릭터의 모든 쌍 사이에, 예를 들면 foo됩니다 f.\{-}o.\{-}o.

이것은 꽤 잘 작동하지만 비 이상적인 일치 항목이 많이 있습니다. 퍼지 검색은 가장 짧은 일치 항목을 먼저 생성해야한다고 생각합니다. 다음 예제를 고려하십시오.

public void put()

대한 퍼지 검색 수행 put(이렇게하면 p.\{-}u.\{-}t) 전체 문자열을 일치 public void put하지만, 짧은 put일치하는 내에서 더 유용 할 것이다.

탐욕스럽지 않은 연산자는 이전에 끝나는 일치 항목을 찾는 데 능숙 하지만 동시에 시작 하는 일치 항목을 선호하는 항목이 필요합니다 . 개념적으로는 양방향으로 욕심이 없어야합니다. 이것이 가능한가?


또한보십시오 : stackoverflow.com/q/15191291 (아쉽게도 질문에 대한 답변은 없습니다)
Doorknob

1
@Doorknob, 대답은 없지만 좋은 지적 : Regex는 문자열 중간에서 검색을 시작하지 않습니다. 작업을 완료하려면 VimScript가 필요할 수 있습니다. 나는 (긴) 일치를 뒤집고 반대 패턴을 찾는 아이디어를 탐구하고 있습니다.
tommcdo

2
Tim Pope는 오늘 vim-haystack을 출시했습니다 . 필요한 것과 비슷하게 들립니다. 어쩌면 당신은 그것으로부터 영감을 얻거나 어쩌면 그것을 사용할 수도 있습니다.
tokoyami 2012

1
패턴을 만족시키면서 경기가 가능한 한 늦게 시작하고 가능한 빨리 종료되기를 원합니다.
tommcdo

1
근사 문자열 일치 알고리즘을 살펴보면 정규 표현식보다 퍼지 찾기를 구현하는 데 더 적합한 도구입니다.
toro2k

답변:


2

충분한 예는 없지만 이것이 원하는 것을 수행한다고 생각합니다.

.*\zsp.\{-}u.\{-}t

put귀하의 예 대신에 일치 합니다 public void put. 기본적으로 .*정규식 엔진은 문자열을 뒤로 검색하기 시작합니다. 왜냐하면 .*전체 문자열을 먼저 사용한 다음 역 추적하여 최신 일치 항목을 찾습니다.p.\{-}u.\{-}t


나는 이것을 전에 시도했지만 지금까지는 잊었다. 꽤 좋지만 줄당 하나의 일치 항목 만 있음을 의미합니다 (마지막 가능한 일치 항목). 나는 여전히 pouty puppet두 경기를 하려는 줄을 원합니다 .
tommcdo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.