2011-03-22 2 views
0

3 * (item1; item2; item3;) 형식의 표현식을 가지고 있는데이를 item1; item2; item3으로 바꿉니다. 항목 1, 항목 2, 항목 3, 항목 1, 항목 2, 항목 3; (괄호 안에 괄호 안에 3 개의 괄호를 포함하지 않음)x * (string) 형식의 표현식을 해당 문자열의 x 복사본으로 대체하십시오.

관련 부분을 추출하기 위해 정규 표현식을 쓸 수는 있지만 다른 부분을 수행하는 방법을 잘 모르겠습니다. submatch() 및 평가()하지만 그 자체로 특정 횟수만큼 문자열을 연결하는 방법을 찾을 수 없습니다했습니다 2 {\ 1} 일 것 \ 같은

:%s/\(\d+\)\*(\(\_[^)]\+\))/what goes here...?

내가 기대했던 무언가를, 하지만 중괄호로 숫자를 평가하지는 않습니다. 이것이 잘못된 방향으로가는 것이라면, 특히 이런 식으로하는 것과 관련이 없습니다. 단지 제가 알고있는 것일뿐입니다. 그리고 저는 Vim에서 쉽게 가능했는지 궁금했습니다.

아무도 도와 주셔서 감사합니다! 당신은 문자열의 반복 복사본을 만드는 기능을 정의 할 수

답변

0

사용자 지정 기능이 필요하지 않습니다. 동일한 방법으로 내장 repeat()을 사용할 수 있습니다. 내장 함수의 목록

%s#\v(\d+)\*\((\_[^)]+)\)#\=repeat(submatch(2), submatch(1))#gc

자세한 내용은 여기 정보 :help repeat():help function-list.

0

...

function! RepeatString(n,s) 
    let l:result="" 
    let l:n=a:n 
    while l:n>0 
    let l:result = l:result . a:s 
    let l:n = l:n-1 
    endwhile 
    return l:result 
endfunction 

(참고 :이 n이 큰 경우 매우 비효율적이다, 그것은 잘 저것을 할 수있다, 예를 들어, 목록을 및 join를 호출하면 ... 더 효율적입니다) 다음 :s의 발현 - 평가 기능을 사용

:%s/\(\d\+\)\*(\([^)]\+\))/\=RepeatString(submatch(1),submatch(2))/g 

(참고 : 내 정규 표현식과 당신 사이의 차이의 부부, 오타의 결과에 적용될 수 있습니다 원래의 질문).

+0

우수 감사합니다. 차이점에 관해서는, 내가 알아 차린 것들은 이스케이프 된 +인데, 이것은 내 부분에서 오타였습니다. (지금 그것을 바로 잡으면 문제가 혼동 스러울 것입니다.) 그리고 나는 또한 [^] 전에 [\ _] - 아마도이 질문을 위해 그것을 제거해야했지만, 실제 문제는 아이템이 다른 라인에있을 수 있기 때문에 필요합니다. 다시 한 번 감사드립니다! – Jonathan

관련 문제