Português (Brasil)

Ferramentas de texto e do dia a dia · Kit de ferramentas de texto

Por que ^ e $ correspondem apenas uma vez: sinalizadores regex no navegador localizam e substituem

· Como funciona

expressões regulares localizar e substituir limpeza de texto

Uma lista de múltiplas linhas mostrando uma âncora de texto inteiro e limites repetidos de novas linhas explícitas
Ilustração vetorial original ToolAcre

Explica os sinalizadores regex JavaScript - global, multiline e dotAll - e por que uma caixa localizar e substituir compilada sem âncoras multilinhas ^ e $ para todo o texto, com padrões que funcionam em seu lugar.

O padrão que apenas corrigiu a primeira linha — o que acontece quando você espera que ^ signifique 'início de cada linha'

Uma lista colada pode conter o mesmo prefixo indesejado em todas as linhas, mas a pesquisa por `^prefix` o remove apenas da primeira linha. O resultado surpreendente vem da configuração do padrão, não de dados inconsistentes. Em ToolAcre, `^` identifica o início do texto completo porque a expressão regular é compilada sem modo multilinha.

A âncora `$` correspondente segue a mesma regra na outra borda: identifica o final do texto completo, não todas as linhas que terminam dentro dele. Uma quebra de linha permanece parte da entrada, mas não se torna outra posição de âncora. Verifique a contagem de substituições informada antes de importar a lista limpa; uma contagem de um expõe a incompatibilidade imediatamente.

O sinalizador g - por que 'substituir todas as partidas em uma passagem' depende do sinalizador global que está sendo definido

ToolAcre sempre constrói seu padrão de pesquisa com o sinalizador global `g`. Essa escolha diz a JavaScript para coletar todas as correspondências não sobrepostas, em vez de parar após a primeira. A ferramenta primeiro chama `match` para determinar a contagem e, em seguida, passa o mesmo padrão global para `replace`, para que o número exibido e a passagem de substituição usem uma regra correspondente.

A correspondência global não pode criar posições que o padrão não reconheça. Com `^prefix`, há apenas um início de texto inteiro elegível, então `g` ainda encontra uma correspondência. Com um padrão que pode ocorrer em diversas linhas, `g` permite que todas as ocorrências sejam substituídas. Separe estas questões durante a depuração: as âncoras decidem onde uma correspondência pode começar, enquanto o modo global decide se a pesquisa continua.

O sinalizador m — como a multilinha muda ^ e $ de âncoras de texto inteiro para âncoras de linha e por que essa ferramenta a deixa desativada

O sinalizador multilinha `m` altera a forma como `^` e `$` são interpretados, permitindo-lhes reconhecer posições em torno dos terminadores de linha, bem como os limites externos do texto. ToolAcre não adiciona esse sinalizador. Seu compilador usa `g` para pesquisas com distinção entre maiúsculas e minúsculas e `gi` quando a distinção entre maiúsculas e minúsculas é apagada, sem controle do usuário para sinalizadores adicionais.

Deixar multilinha indisponível mantém a interface pequena, mas significa que os padrões copiados de um editor configurado com `gm` podem se comportar de maneira diferente aqui. Não presuma que uma expressão familiar carrega consigo suas bandeiras. As letras de sinalização JavaScript são fornecidas quando o RegExp é criado e esta ferramenta rejeita a sintaxe de sinalização in-line não suportada em vez de ativar silenciosamente outro modo.

O sinalizador s — por que um ponto não corresponde a uma nova linha por padrão e como fazer a correspondência entre linhas sem ele

Um ponto nesta ferramenta não corresponde a uma quebra de linha porque o compilador também omite o sinalizador dotAll `s`. Um padrão como `BEGIN.*END` pode corresponder quando ambos os marcadores estão em uma linha, mas para na primeira quebra de linha quando os marcadores abrangem várias linhas. Adicionar o modo global não altera o que o próprio ponto pode consumir.

Quando uma correspondência cruzada for genuinamente necessária, escreva explicitamente os caracteres permitidos. Uma classe como `[\s\S]*?` pode abranger espaços em branco e não espaços em branco, permanecendo relutante, embora padrões amplos mereçam ser testados primeiro em uma amostra pequena. O compilador captura sintaxe inválida, mas não protege a guia de uma expressão cara com comportamento de retrocesso severo.

Correspondência explícita de novas linhas — usando \n no padrão para direcionar o início e o fim da linha quando a multilinha não estiver disponível

Para inícios de linha repetidos sem modo multilinha, corresponda ao início do texto ou a uma nova linha: `(^|\n)prefix`. A primeira alternativa trata a primeira linha e a segunda trata as linhas posteriores consumindo a nova linha anterior. Os parênteses capturam qualquer limite correspondente, dando ao substituto uma maneira de reter a estrutura que separava as linhas.

Esta técnica assume separadores de avanço de linha no padrão. A biblioteca de texto reconhece CRLF, LF e CR solitário ao executar operações de linha dedicada, mas localizar e substituir pesquisa diretamente a string original. Se o conteúdo colado usar outra forma de final de linha, normalize-o primeiro ou adapte a expressão deliberadamente; caso contrário, as linhas posteriores poderão permanecer inalteradas, mesmo que pareçam idênticas na tela.

Combine os limites da linha explicitamente com (^|\n) e preserve o separador capturado

Suponha que a entrada seja `ID: apple`, `ID: pear` e `ID: plum` em linhas separadas. Habilite Regex, encontre `(^|\n)ID: ` e substitua por `$1`. Na primeira linha, `$1` é a posição inicial vazia; nas linhas posteriores, é a nova linha capturada. Os rótulos desaparecem enquanto todos os limites das três linhas permanecem no lugar.

Leia a contagem de substituições antes de aceitar o resultado. Três linhas devem produzir três substituições neste exemplo. Se a contagem for uma, inspecione o padrão real e os finais de linha em vez de repetir a operação. Desfazer está disponível após uma substituição, portanto, uma pequena tentativa pode confirmar a correspondência e a reconstrução antes que a mesma expressão atinja uma lista de importação mais longa.

O que isso não cobre - os sinalizadores u, i e y e a inserção de novas linhas na substituição, o que um campo de linha única não pode fazer

A implementação também usa `i` quando a distinção entre maiúsculas e minúsculas está desativada, mas não expõe controles para `u`, `y`, `m` ou `s`. Este artigo não atribui comportamento a esses modos indisponíveis, além de explicar os efeitos multilinha e dotAll ausentes necessários para o exemplo. Padrões de outro ambiente JavaScript devem ser revisados ​​em relação aos sinalizadores que ToolAcre realmente compila.

A fonte prova que o texto de substituição é passado para JavaScript `String.replace`, portanto, substituições como `$1`, `$&` e `$$` mantêm seus significados JavaScript. Não estabelece todas as interações oferecidas pelo campo renderizado a partir dos arquivos aqui utilizados. Em particular, a inserção de novas linhas físicas através da interface deve ser testada, em vez de inferida apenas a partir do esboço.

Outros sinalizadores e comportamento de campo de substituição estão fora da implementação desta ferramenta

Trate os sinalizadores como parte de uma expressão regular, mesmo quando uma interface exibe apenas o corpo do padrão. Em ToolAcre, cada pesquisa é global, o modo opcional sem distinção entre maiúsculas e minúsculas adiciona `i` e multiline e dotAll estão ausentes. Esses fatos explicam por que a substituição continua nas correspondências comuns, enquanto `^`, `$` e dot mantêm suas restrições padrão de texto inteiro e de linha única.

Para uma lista colada com prefixo, `(^|\n)prefix` com `$1` é a solução prática porque nomeia o limite e o preserva. Comece com linhas representativas, confirme a contagem, inspecione a estrutura de linhas resultante e só então processe o conjunto de dados completo. Esse procedimento transforma um resultado intrigante de uma correspondência em uma etapa de limpeza revisável antes da importação.