Sublime Text 2에서 정규식 검색 대체


440

Sublime Text 2에서 검색을 정규 표현식으로 바꾸려고 합니다. 이것에 대한 문서 는 다소 빈약합니다. 특히, 그룹을 바꾸고 싶습니다.이 텍스트를 변환하는 것과 같습니다.

Hello my name is bob

그리고이 검색어 :

무엇을 찾다: my name is (\w)+

다음으로 교체하십시오. my name used to be $(1)

검색어는 정상적으로 작동하지만 regexp 그룹을 사용하여 실제로 교체하는 방법을 알 수 없습니다.

답변:


584

일반적으로 역 참조는 첫 번째 캡처 그룹 (괄호 안의 패턴의 첫 번째 일치)에 대해 $1또는 \1(백 슬래시 1)이며 실제로 Sublime은 두 구문을 모두 지원합니다. 그래서 시도하십시오 :

my name used to be \1

또는

my name used to be $1

또한 원본 캡처 패턴은 다음과 같습니다.

my name is (\w)+

이름이 잘못되어 전체 이름이 아닌 이름의 마지막 문자 만 캡처합니다. 이름의 모든 문자를 캡처하려면 다음 패턴을 사용해야합니다.

my name is (\w+)

15
빼고요 $0?
Skylar Saveland 2016 년

11
아니요, $ 0은 정규 표현식에서 역 참조로 사용되지 않습니다 ( \0널 문자와 같기 때문에\0ddd 코드 포인트가 ddd 인 문자의 이스케이프로 사용됨). 그러나이 페이지$0 에 따라 Sublime2에서 "종료 표시"로 사용되는 것 같습니다 (Sublime2 에서 종료 표시가 사용되는 방식을 정확하게 계산하기에 충분한 예제를 찾는 데 어려움이 있습니다).
Bobulous

3
종료 기호 $0는 Sublime Text 2/3에서 커서를 스 니펫 확장에서 나가기 위해 사용됩니다. 스 니펫에 대한 추가 정보 .
jrhorn424

2
$ 0 아직 숭고한 텍스트 2 전체 표현식을 역 참조 작동
sturrockad

2
$0전체 정규식 일치입니다. $1첫 번째 캡처 그룹입니다.
올레 타

103

그건 그렇고, 위의 질문에서 :

에 대한:

Hello, my name is bob

부분 찾기 :

my name is (\w)+

교체 부품 :

my name used to be \1

돌아올 것이다 :

Hello, my name used to be b

찾기 부분을 다음으로 변경하십시오.

my name is (\w+)

그리고 교체는 당신이 기대하는 것입니다 :

Hello, my name used to be bob

(\ w) +는 "bob"과 일치하지만 교체하려는 그룹이 아닙니다.


52

중요 : ( )검색 문자열에 괄호를 사용하십시오

이전 답변은 정확하지만 강조해야 할 중요한 사항이 있습니다! 모든 검색 문자열에서 일치하는 부분 당신이 당신에 사용하려는 대체 문자열을 해야 둘러싸인 ( )괄호 그렇지 않으면이 일치하는 부분과 같은 정의 된 변수에 액세스 할 수 없습니다, $1, $2또는 \1, \2

예를 들어 'em'을 'px'로 바꾸고 숫자 값은 유지하려고합니다.

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • 교체 문자열 : margin: $1px또는margin: \1px
  • 검색 문자열 (CORRECT) : margin: ([0-9]*)em// 괄호
  • 검색 문자열 (INCORRECT) : margin: [0-9]*em

올바른 사례 예 :margin: ([0-9]*)em 검색 문자열 사용 (괄호 포함). 다음과 같이 원하는 일치 세그먼트 (예 : $1또는 \1)를 ( )괄호로 묶습니다.

  • 찾기 : margin: ([0-9]*)em(괄호)
  • 다음으로 교체 : margin: $1px또는margin: \1px
  • 결과:
    margin: 10px;
    margin: 2px;

부정확 한 사례 예 :margin: [0-9]*em 검색 문자열 사용 (괄호없이). 다음 정규식 패턴은 원하는 줄과 일치하지만 일치하는 세그먼트는 $1또는 같은 문자열로 대체 된 문자열에서 사용할 수 없습니다 \1.

  • 찾기 : margin: [0-9]*em(괄호없이)
  • 다음으로 교체 : margin: $1px또는margin: \1px
  • 결과:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1
감사합니다.이 답변은 실제로 내 문제를 해결 한 흥미로운 사실을 지적합니다.
Enkk

지적 해 주셔서 감사합니다. ()를 사용하면 Sublime 3에서 \ 1로 바꿀 수 있습니다.
Jeffrey

47

다음은 승인 된 답변을 시각적으로 나타낸 것입니다.

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


왜 찾지 $_SESSION[(\w+)않습니까? 감사합니다
Toni Michel Caubet

$, [, (및)는 특수 문자이므로 각 특수 문자를 백 슬래시로 이스케이프해야합니다.
zeeawan '12

25

캡처 그룹을 9 개 이상 사용하는 경우 구문을 사용해야합니다 ${10}.

$10\10또는 \{10}것입니다 하지 작동합니다.


감사! 나를 대체하고를 추가하는 예를 들어 캡처 그룹의 끝에 숫자를 추가 할이 도움이되었다 1당신이 같은 괄호를 사용하는 데 필요한 두 번째 캡처 그룹에 ${2}1; 21 달러는 존재하지 않는 21 번째 캡처 그룹을 나타냅니다.
에릭

1

보면 검색에 대한 숭고한 텍스트 비공식 문서의 기사 및 바꾸기 처럼, 그것은 보이는 +(.+)당신이 할 수 있습니다 캡처 그룹은 ...하지만 난 개인적으로 사용 (.*)하고 잘 작동. 당신이 말하는 방식으로 교체하려면이 좋아할만한 포럼에서 대화 , 특히 이 게시물 단순히 사용 말한다 $1첫 번째 캡처 그룹을 사용합니다.

그리고 그림이 말보다 낫기 때문에 ...

전에: 찾기 / 바꾸기 전에

후: 찾기 / 바꾸기 후

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