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
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.