A pesquisa de expressão regular substitui no Sublime Text 2

440

Estou procurando fazer a substituição da pesquisa por expressões regulares no Sublime Text 2. A documentação sobre isso é bastante anêmica. Especificamente, quero fazer uma substituição em grupos, algo como converter este texto:

Hello my name is bob

E este termo de pesquisa:

Encontre o que: my name is (\w)+

Substituir com: my name used to be $(1)

O termo de pesquisa funciona muito bem, mas não consigo descobrir uma maneira de fazer uma substituição usando o grupo regexp.

hackerhasid
fonte

Respostas:

584

Normalmente, uma referência traseira é $1ou \1(barra invertida uma) para o primeiro grupo de captura (a primeira correspondência de um padrão entre parênteses) e, de fato, o Sublime suporta as duas sintaxes. Então tente:

my name used to be \1

ou

my name used to be $1

Observe também que seu padrão de captura original:

my name is (\w)+

está incorreto e capturará apenas a letra final do nome em vez do nome inteiro. Você deve usar o seguinte padrão para capturar todas as letras do nome:

my name is (\w+)
Bobulous
fonte
15
exceto, não é $0?
Skylar Saveland
11
Não, $ 0 não é usado como referência remota em uma expressão regular (porque \0é igual ao caractere nulo e \0dddusado como escape para um caractere com ponto de código ddd). No entanto, $0parece ser usado no Sublime2 como uma "marca de saída" de acordo com esta página (embora eu esteja tendo problemas para encontrar exemplos suficientes para descobrir exatamente como uma marca de saída é usada no Sublime2).
Bobulous
3
A marca de saída $0é usada no Sublime Text 2/3 para colocar o cursor na saída de uma expansão de trecho. Mais sobre trechos .
Jrhorn424
2
$ 0 ainda trabalha para referência anterior a expressão inteira em Sublime Text 2
sturrockad
2
$0é a correspondência de regex inteira; $1é o primeiro grupo de captura.
Oletha
103

A propósito, na pergunta acima:

Para:

Hello, my name is bob

Encontre parte:

my name is (\w)+

Com peça de substituição:

my name used to be \1

Retornaria:

Hello, my name used to be b

Altere encontrar parte para:

my name is (\w+)

E substituir será o que você espera:

Hello, my name used to be bob

Embora (\ w) + corresponda a "bob", não é o agrupamento que você deseja substituir.

CrnaStena
fonte
52

Importante: Use os ( )parênteses na sua sequência de pesquisa

Enquanto a resposta anterior estiver correta, há uma coisa importante a enfatizar! Todos os segmentos correspondentes na sua sequência de pesquisa que você deseja usar na sequência de substituição devem ser colocados entre ( )parênteses , caso contrário, esses segmentos correspondentes não estarão acessíveis a variáveis ​​definidas como $1, $2ou \1, \2etc.

Por exemplo, queremos substituir 'em' por 'px', mas preservar os valores dos dígitos:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Cadeia de substituição: margin: $1pxoumargin: \1px
  • String de pesquisa (CORRETO): margin: ([0-9]*)em// com parênteses
  • Sequência de pesquisa (INCORRETA): margin: [0-9]*em

EXEMPLO DE CASO CORRETO: Usando a margin: ([0-9]*)emsequência de pesquisa (entre parênteses). Coloque o segmento correspondente desejado (por exemplo, $1ou \1) entre ( )parênteses, da seguinte maneira:

  • Localizar: margin: ([0-9]*)em(entre parênteses)
  • Substitua por: margin: $1pxoumargin: \1px
  • Resultado:
    margin: 10px;
    margin: 2px;

EXEMPLO DE CASO INCORRETO: Usando a margin: [0-9]*emsequência de pesquisa (sem parênteses). O seguinte padrão regex corresponderá às linhas desejadas, mas os segmentos correspondentes não estarão disponíveis na cadeia substituída como variáveis ​​como $1ou \1:

  • Localizar: margin: [0-9]*em(sem parênteses)
  • Substitua por: margin: $1pxoumargin: \1px
  • Resultado:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */
Hrvoje Golcic
fonte
1
Obrigado, esta resposta realmente indica um fato interessante que resolveu meu problema.
Enkk 29/03/16
Obrigado por apontar isso. Com (), eu posso fazer a substituição com \ 1 no Sublime 3.
Jeffrey
47

Aqui está uma apresentação visual da resposta aprovada.

insira a descrição da imagem aqui

zeeawan
fonte
por que não está encontrando $_SESSION[(\w+)? obrigado
Toni Michel Caubet 29/11/19
Como $, [, (, e) são caracteres especiais, você deve escapar de cada caractere especial com uma barra invertida.
zeeawan
25

Observe que se você usar mais de 9 grupos de captura, precisará usar a sintaxe ${10}.

$10ou \10ou não\{10} irá funcionar.

Andreas Haferburg
fonte
Obrigado! Isso foi útil para eu substituir e adicionar um número ao final do grupo capturado, por exemplo, para adicionar um 1ao segundo grupo de captura que você precisa usar chaves como ${2}1; $ 21 refere-se ao 21º grupo de captura, que não existe.
Eric
1

Olhando para o artigo da Documentação não oficial de texto sublime sobre Pesquisar e substituir , parece que +(.+)é o grupo de captura que você pode desejar ... mas eu pessoalmente o usei (.*)e funcionou bem. Para SUBSTITUIR da maneira que você está dizendo, você pode gostar dessa conversa nos fóruns , especificamente nesta postagem que diz simplesmente usar $1para usar o primeiro grupo capturado.

E como as imagens são melhores que as palavras ...

Antes: antes de encontrar / substituir

Depois de: depois de encontrar / substituir

Blairg23
fonte