A tarefa que me fez construir isso foi chata, e é exatamente por isso que valeu a pena automatizar Um cliente me entregou uma exportação de 4.000 linhas onde cada data era escrita em estilo americano, 01/15/2024, e o sistema em que estava entrando queria ISO, 2024-01-15. Um simples find-and-replace não podia tocá-lo, porque não havia uma string fixa para procurar - as datas eram todas diferentes O que eles compartilhavam era um forma: dois dígitos, uma barra, dois dígitos, uma barra, quatro dígitos Esse é precisamente o tipo de coisa que uma expressão regular corresponde, e precisamente o tipo de coisa que uma substituição regex reescreve em uma passagem Colei o arquivo em uma ferramenta de rascunho, escrevi uma expressão e toda a exportação inverteu o formato em menos de um segundo.
Esse é o trabalho gratuito Regex Substituir ferramenta faz, e este guia é a versão longa de como usá-lo bem Eu vou cobrir o que uma substituição regex realmente é, como backreferences grupo de captura deixá-lo reestruturar texto em vez de apenas excluí-lo, o que cada token de substituição especial significa, e os erros que tropeçam as pessoas Ele senta-se ao lado do testador regex Eu escrevi sobre separadamente - o testador diz o que um padrão corresponde, e esta ferramenta reescreve o que ele combina Se as próprias expressões regulares são novas para você, comece com o guia completo de ferramentas de codificação e volta.
tl;dr: Uma substituição regex corresponde texto por padrão e reescreve cada correspondência usando uma string de substituição Envolva as peças que deseja reutilizar entre parênteses para criar grupos numerados e, em seguida, faça referência a elas na substituição
$1,$2, e assim por diante - o padrão(\d{4})-(\d{2})-(\d{2})com substituição$3/$2/$1vira2024-01-15em15/01/2024. Ligue ogsinalize para substituir cada correspondência, deixe a substituição vazia para excluir correspondências e use$<name>para grupos nomeados. O Regex Substituir ferramenta é executado inteiramente em seu navegador e mostra a contagem de substituição ao vivo.
O que é um substituto regex?
Um find-and-replace comum funciona em texto literal: você digita a palavra exata que você está procurando e a palavra exata para colocar em seu lugar Ele falha no momento em que a coisa que você deseja mudar não é uma string fixa, mas um padrão - uma data em qualquer uma das cem formas, um número de telefone, uma tag HTML, uma execução de espaço em branco à direita, um nome de variável que segue uma convenção Uma expressão regular descreve esse padrão e uma substituição regex o emparelha com um modelo que diz como cada partida deve ser reescrita.
O mecanismo tem duas metades O padrão é uma expressão regular com a qual o mecanismo verifica seu texto, encontrando todos os lugares onde a forma ocorre. O substituição é uma string substituída para cada correspondência. No caso mais simples, a substituição é texto simples e cada correspondência se torna a mesma coisa - útil para normalizar, digamos, cada execução de guias e espaços em um único espaço. O caso poderoso é quando a substituição se refere a partes do que foi correspondido, de modo que a saída é construída a partir da entrada em vez de ser uma constante fixa. É isso que transforma uma substituição regex de uma exclusão e reciclagem contundente em uma ferramenta de reestruturação genuína.
Sob o capô, o Regex Substituir ferramenta usa o JavaScript RegExp motor e o String.prototype.replace método que todo navegador e Node.js envia. Isso importa por um motivo prático: o comportamento que você vê na ferramenta é idêntico ao comportamento que você obterá se colar o mesmo padrão e substituição em seu próprio código JavaScript ou TypeScript. Não há sabor separado para aprender e nenhuma surpresa quando você passa da ferramenta de rascunho para a produção A sintaxe de substituição que a ferramenta aceita - $1, $&, $<name> e o resto - é a sintaxe exata que o padrão define, documentada Referência de string.replace MDN's.
Como funcionam as referências anteriores do grupo de captura?
Esta é a única ideia mais útil na substituição regex, e vale a pena desacelerar para. Quando você coloca parte de um padrão entre parênteses, você cria um grupo captura. O motor lembra o texto que o grupo correspondia, e numera os grupos da esquerda para a direita começando em um Na string de substituição, $1 significa que o & quot; insere o que quer que o primeiro grupo tenha capturado, & quot; $2 o segundo, e assim por diante até $99.
O exemplo da data torna-o concreto O padrão (\d{4})-(\d{2})-(\d{2}) tem três grupos: o ano de quatro dígitos, o mês de dois dígitos e o dia de dois dígitos. Quando corresponde 2024-01-15, o grupo um segura 2024, o grupo dois detém 01, e o grupo três detém 15. Uma substituição de $3/$2/$1 em seguida, monta uma nova corda a partir dessas peças em uma ordem diferente e com separadores diferentes, produzindo 15/01/2024. Nada foi excluído e redigitado - a saída é literalmente reconstruída a partir dos fragmentos capturados Reordenar os tokens, alterar a pontuação entre eles, envolvê-los em outro texto, e você reformatou cada data no arquivo com uma expressão.
Grupos nomeados são a mesma ideia com rótulos legíveis Em vez de contar parênteses, você escreve (?<year>\d{4}) e consulte-o na substituição como $<year>. Para um padrão com dois ou três grupos os números são bons, mas uma vez que você está fazendo malabarismos com cinco ou seis, os nomes tornam o padrão e a substituição muito mais fáceis de ler e de mudar mais tarde. A ferramenta suporta ambos de forma intercambiável, para que você possa misturar $1 e $<name> na mesma substituição se você gosta Quando você está montando pela primeira vez um padrão e ainda não tem certeza de quais grupos você precisa, o Construtor Regex ajuda você a construí-lo peça por peça antes de trazê-lo aqui para executar a substituição.
O que significam os tokens de substituição especiais?
O cifrão é especial dentro de uma string de substituição, e introduz um pequeno conjunto de tokens além dos grupos numerados e nomeados Conhecê-los salva você de alcançar um padrão mais complicado do que você precisa.
$& insere toda a substring combinada É o que você deseja quando estiver envolvendo ou anotando correspondências em vez de reconstruí-las - um padrão de \b\w+@\w+\.\w+\b com uma substituição de <$&> coloca colchetes angulares em cada endereço de e-mail sem que você precise capturar tudo em um grupo. $\`` (a backtick) inserts everything *before* the match, and $ '(an apostrophe) inserts everything *after* it; these are rarely needed but occasionally exactly right. And because$is special, outputting a literal dollar sign requires doubling it:$$in the replacement produces a single$` the output, que importa o dia em que você está reformatando a moeda.
Há um idioma de exclusão que vale a pena comprometer com a memória: uma substituição vazia remove cada correspondência Com o sinalizador global ativado e o campo Substituir deixado em branco, a ferramenta exclui cada ocorrência do padrão do texto Essa é a maneira mais limpa de retirar algo - todas as tags HTML com <[^>]+>, cada espaço de fuga com +$ no modo multilinha, todos os não dígitos de um número de telefone com \D. Você não está substituindo por um espaço ou espaço reservado; você está substituindo por nada e a correspondência simplesmente desaparece.
Quais bandeiras são importantes para uma substituição?
As bandeiras em um regex mudam a forma como ele é aplicado, e duas delas dominam o trabalho de substituição diário O resto é situacional, mas ocasionalmente decisivo.
A bandeira global, g, é aquele que você mais alternará Sem ele, JavaScript's replace muda apenas o primeiro combine e deixe o resto do texto sozinho - isso é padrão String.replace comportamento e surpreende as pessoas que esperam um substituto para tudo. Virar g on e cada partida no texto é reescrita A ferramenta padrão para global on, porque substituir tudo é o que as pessoas querem dizer dezenove vezes em vinte, mas a alternância está lá para os tempos que você realmente quer tocar apenas a primeira ocorrência A bandeira de caso de ignorar, i, faz o padrão combinar independentemente do caso da letra, então error também partidas Error e ERROR - essencial quando você está normalizando os níveis logarítmicos ou arrumando a capitalização inconsistente.
A bandeira multilinha, m, muda o que as âncoras ^ e $ média: com ele ligado, eles correspondem ao início e ao fim de cada um desfila em vez de todo o texto, que é o que você deseja quando você está retirando espaços em branco ou prefixando cada linha. A bandeira dotAll, s, deixa o ponto corresponder aos caracteres da nova linha, para que um padrão possa abranger quebras de linha - úteis para reescrever blocos de várias linhas. O u (unicode) e y os sinalizadores (pegajosos) são para casos avançados: u permite o manuseio correto de caracteres fora do plano básico e de certas formas de escape, e y ancora cada partida na tentativa para a posição exata após a anterior. A tabela de comparação abaixo resume quando cada uma ganha seu lugar.
| pavilhão | Carta | Efeito sobre uma substituição | Uso típico |
|---|---|---|---|
| global | g |
Substitua cada partida em vez de apenas a primeira | Quase todos substituem tudo |
| Ignorar caso | i |
Corresponder independentemente do caso da carta | Normalizando os níveis de log, arrumando a capitalização |
| Multilinha | m |
^ e $ ancoragem a cada linha |
Prefixação de linhas, remoção de espaços de arrasto |
| PontoTudo | s |
O ponto também corresponde às novas linhas | Reescrevendo blocos multilinhas |
| Unicode | u |
Manuseio correto de caracteres astrais e \u{...} |
Emoji, escritas não latinas |
| Adesivo | y |
Corresponder apenas na posição atual | Tokenisers, análise sequencial estrita |
Quando devo usar o regex replace em vez de um simples find-and-replace?
A linha divisória é simples: use um simples encontrar-e-substituir quando você sabe o texto exato, e alcance para regex substituir quando você sabe a forma, mas não o texto exato Se você está mudando cada 2023 até 2024, uma substituição comum é mais rápida e segura Se você estiver mudando a cada ano de quatro dígitos, independentemente do valor, apenas um padrão pode expressar isso.
Três famílias de tarefas caem claramente no lado regex O primeiro é reformatação, onde o conteúdo permanece o mesmo mas a sua disposição muda - datas, números de telefone, nomes escritos & quot; Último, Primeiro & quot; que você deseja como & quot; Primeiro Último." Capture grupos mais uma substituição reordenada manipule todos estes O segundo é decapagem a granelonde você exclui tudo que corresponde a um padrão - tags, comentários, caracteres de controle, espaços em branco extras - substituindo por nada O terceiro é edição condicional em escala, onde você embrulhar, prefixar ou anotar cada ocorrência de um padrão, usando $& para manter a correspondência e adicionar a ela Quando a transformação que você está descrevendo para si mesmo contém a palavra & quot; every" seguida por uma descrição em vez de uma string literal, você está no território regex-replace.
Há também um argumento de fluxo de trabalho, Fazendo essas edições em seu editor de código' s encontrar-e-substituir funciona, mas ele edita o arquivo no lugar, o que significa que um erro é um erro em seu arquivo real Executar a transformação em uma ferramenta de rascunho primeiro permite que você veja a saída e a contagem de substituição antes de cometer qualquer coisa, em seguida, cole o resultado verificado de volta Porque o Regex Substituir ferramenta é executado inteiramente em seu navegador e nunca carrega o que você colar, é seguro para usar mesmo quando o texto é um registro de produção ou uma exportação do cliente - um ponto que EU faço na íntegra no guia de privacidade de dados para ferramentas online.
Quais são os erros comuns com regex substituir?
A mais frequente é esquecer a bandeira global e se perguntar por que apenas a primeira partida mudou Se o seu substituto parece não ter feito quase nada - uma edição onde você esperava dezenas - verifique isso g está ligado. É uma viagem tão comum que a ferramenta o usa como padrão, mas no momento em que você desligá-lo para atingir uma única correspondência, lembre-se de voltar atrás.
A segunda é um literal $1 aparecendo na saída onde você esperava texto capturado Isso quase sempre significa que o grupo que você está referenciando não existe - seu padrão não tem primeiro conjunto de parênteses, então não há nada para $1 para substituir, e o motor deixa o token como está A correção é envolver a peça que você deseja reutilizar entre parênteses para criar o grupo, e contar grupos da esquerda começando em um Uma armadilha relacionada está contando mal quando seu padrão tem grupos aninhados ou opcionais; quando a numeração fica confusa, mude para grupos nomeados para que a referência seja inequívoca.
O terceiro erro é um padrão que corresponde mais do que você pretendia, geralmente porque um quantificador é ganancioso Um padrão como <.+> destinado a corresponder a uma tag HTML, combinará alegremente desde o início < ao antecede > na linha, engolindo tudo entre duas tags A cura é um quantificador não ganancioso, <.+?>, ou uma classe de caracteres mais precisa, <[^>]+>. Esta é exatamente a situação em que você verifica o padrão no testador regex primeiro, observe o que ele destaca e só então execute a substituição - um hábito guia regex-tester percorre em detalhes A contagem de substituição mostrada na ferramenta é sua outra salvaguarda: se ela relatar muito mais ou muito menos substituições do que o número de coisas que você pretendia mudar, o padrão está errado, não a ferramenta.
Um exemplo trabalhado: reformatar nomes e eliminar ruídos
Deixe-me percorrer um pequeno trabalho de ponta a ponta, porque ver as peças funcionarem juntas corrige a ideia melhor do que qualquer regra única Suponha que você tenha uma lista de contatos exportados como Doe, Jane e Smith, John, um por linha, e você os quer como Jane Doe e John Smith.
A forma de cada linha é: alguns caracteres de palavras, uma vírgula, um espaço, em seguida, mais caracteres de palavras Como um padrão que é (\w+), (\w+), com o sobrenome capturado no grupo um e o nome dado no grupo dois A substituição que os troca e deixa cair a vírgula é $2 $1 - grupo dois, um espaço, grupo um. Cole a lista no Regex Substituir ferramenta, introduza esse padrão e substituição, deixe a bandeira global ligada, e cada linha passa para o & quot;First Last" de uma só vez A contagem de substituição indica-lhe quantas linhas foram tocadas, o que poderá verificar com sanidade o número de contactos.
Agora diga que a mesma exportação tem espaço em branco à direita em algumas linhas que você também quer que desapareçam Isso é um segundo substituto separado: padrão +$ com a bandeira multilinha assim $ corresponde ao final de cada linha e a uma substituição vazia para que os espaços correspondentes sejam excluídos em vez de substituídos Execute-o após a troca de nomes e o arquivo esteja limpo A abordagem de duas passagens - uma substituição para reestruturar, outra para retirar - é típica e, como cada passagem mostra sua saída e contagem antes de copiá-lo, você nunca está adivinhando se a transformação fez o que você quis dizer Quando o texto remodelado precisar de uma diferença visual final em relação ao original para confirmar nada mais movido, cole ambas as versões no Diferença de texto ferramenta. Para o kit mais amplo de utilitários do dia a dia que isso se encaixa, o Kit de ferramentas para desenvolvedores web recolhe os que mais alcancei.
Perguntas frequentes
Como encontro e substituo por uma expressão regular online? Insira seu padrão no campo Localizar sem barras, escreva a substituição no campo Substituir, escolha suas bandeiras e cole seu texto A saída reescrita aparece instantaneamente e mostra quantas substituições foram executadas Tudo acontece no seu navegador, então nada é carregado.
Como funcionam as referências anteriores do grupo de captura na substituição?
Os parênteses no seu padrão criam grupos numerados, e você os reutiliza na substituição por $1, $2 e assim por diante Por exemplo, o padrão (\d{4}) - (\d{2}) - (\d{2}) com a substituição $3/$2/$1 transforma 2024-01-15 em 15/01/2024. grupos nomeados como (?
Como substituo todas as partidas em vez de apenas a primeira? Habilite o sinalizador g (global).Sem ele, o JavaScript substitui apenas a primeira correspondência, exatamente como o método String.replace se comporta Com g habilitado, cada correspondência no texto é substituída, que é o que a maioria das tarefas substituem-todas precisam.
Como excluo cada partida em vez de substituí-la? Deixe o campo Substituir vazio Com a bandeira global ligada, cada correspondência é removida do texto Esta é a maneira mais limpa de retirar tags, execuções de espaços em branco ou caracteres indesejados que compartilham um padrão.
O que significam os tokens especiais $ & amp;, backtick e apóstrofo na substituição? $& amp; insere toda a substring correspondente, um backtick insere o texto antes da partida e um apóstrofo insere o texto depois dela Para produzir um cifrão literal, escreva $$. Eles seguem a string JavaScript padrão.substitua padrões especiais de substituição.
Que sabor regex esta ferramenta usa? Ele usa o mecanismo RegExp JavaScript (ECMAScript) integrado ao seu navegador, que é idêntico ao do Node.js. Os resultados aqui correspondem à forma como o mesmo padrão e substituição se comportam em JavaScript e TypeScript. JavaScript regex difere de PCRE, Python re e Java em alguns recursos avançados.
Por que meu substituto produz um $ 1 literal em vez do texto capturado? Um $1 literal na saída geralmente significa que seu padrão não tem primeiro grupo de captura, então não há nada para $1 para referenciar Envolva a parte que você deseja reutilizar entre parênteses para criar o grupo, e conte grupos da esquerda para a direita começando em 1.
É seguro executar o regex replace em dados confidenciais? Sim. toda correspondência e substituição acontece em JavaScript dentro do seu navegador, portanto, nenhum padrão, substituição ou texto é enviado para qualquer servidor, nada é registrado e a ferramenta funciona com sua conexão desativada. Você pode reformatar com segurança arquivos de log, dados pessoais ou formatos proprietários.
Este guia acompanha o gratuito Regex Substituir ferramenta em Toolz.dev - sem inscrição, sem uploads, funciona offline.



