Explicação da expressão Find

Explicação da expressão Find

Tenho vários arquivos de texto com algo semelhante aos seguintes exemplos:

{
    {
        1,
        text1,
        text2,
    }
}
{
    {
        52,
        text1,
        text2,
    }
}
{
    {
        105,
        text1,
        text2,
    }
}

eu queria saber como eu poderia pesquisar em massa vários arquivos e substituí-los da seguinte maneira:

{
    {
        17001,
        text1,
        text2,
    }
}
{
    {
        17052,
        text1,
        text2,
    }
}
{
    {
        17105,
        text1,
        text2,
    }
}

basicamente eu adicionaria 17.000 a cada um dos primeiros números após cada colchete duplo de abertura. Tentei usar \d\d\d para substituir números por 17\d\d\d mas isso me daria 17ddd a letra e não o número. Ajuda por favor

Responder1

Você tem dois problemas:

  1. Na string de substituição \dsignifica "imprimir um d" e nada mais. Todas as coisas especiais de expressões regulares como \dand \w, etc. funcionam apenas no padrão de pesquisa, não na string de substituição.
  2. Como disse @DavidPostill, o Notepad ++ não pode fazer matemática na pesquisa/substituição de regexp.

Você tem três opções para fazer o que quiser:

  1. Use algum programa, script ou plugin para fazer as substituições para você. Qualquer versão disso é, como diz o comentário mencionado anteriormente, fora do assunto aqui.
  2. Use a pesquisa do Notepad++ e substitua 3 vezes.
    • Primeira rodada para um único dígito,
    • Segunda rodada para dois dígitos, e
    • Terceira rodada para três dígitos.
  3. Se você tiver o Notepad++ superior à v6.0, poderá usar a sintaxe PCRE no regexp e usar oexcelente respostapor @ACR para fazer tudo de uma só vez.

Para fazer isso no método de três passagens, use as etapas a seguir. Talvez seja necessário modificar os padrões de pesquisa para capturar o que você deseja e apenas o que deseja. Eles funcionam no exemplo fornecido acima, mas seus arquivos podem ser mais complexos que o exemplo.

Primeiro round

Encontre isto:

(\s+)(\d),

Substitua por isto:

\11700\2,

Segundo round

Encontre isto:

(\s+)(\d\d),

Substitua por isto:

\1170\2,

Terceira Rodada

Encontre isto:

(\s+)(\d\d\d),

Substitua por isto:

\117\2,

O que faz

No Find thispadrão \s+encontra todos os espaços em branco que podem ser encontrados antes do próximo token, exigindo pelo menos um para evitar a correspondência de um número após qualquer coisa que não seja um espaço em branco. O ()entorno faz dela a primeira string capturada retornada pela partida. Em vez disso, corresponde \da um dígito e os grupos \d\dfazem \d\d\dcom que corresponda exatamente a 2 ou três dígitos. Novamente, ()transforme-o em um grupo de captura, desta vez o segundo. Finalmente, ,corresponde à vírgula após os números, o que o mantém na mesma linha em seu arquivo de amostra.

No Replace with this, o \1é substituído pelo primeiro grupo de captura (os espaços). 1700, 170e 17imprima a parte que precisa ser adicionada à linha. O \2é substituído pelo segundo grupo de captura, que é o(s) dígito(s) que você possui no padrão de localização. Finalmente, a vírgula ,é explicitamente substituída, em vez de desperdiçar um grupo de captura para ela.

Responder2

Você pode fazer isso com uma única localização e substituição. O Notepad++ permite que você faça uma substituição condicional com base na correspondência de um grupo.

Encontre o que:

^(\s*)(\d{3})?(\d{2})?(\d{1})?(,\s*)$

Substituir com:

$1(?{2}17$2)(?{3}170$3)(?{4}1700$4)$5

Explicação da expressão Find

Procedendo de fora para dentro:

  • Os caracteres ^e $marcam o início e o fim de uma linha, respectivamente.
  • Corresponde (\s*)ao espaço em branco no início e (,\s*)corresponde à vírgula e a qualquer espaço em branco no final da linha.
  • No meio temos três grupos diferentes para corresponder a 3, 2 ou 1 dígitos (usando a {n}sintaxe). Cada grupo é seguido por um ?para marcá-lo como possivelmente não correspondente. A ordem dos grupos é importante, pois os grupos são combinados na ordem em que aparecem. Se houver três dígitos, o primeiro grupo corresponderá e não haverá mais dígitos para os dois grupos seguintes. Se houver dois dígitos, o primeiro grupo não corresponderá, o segundo grupo corresponderá e o primeiro grupo não terá nenhum dígito correspondente.

Explicação da expressão de substituição

  • O $1e $5corresponderá ao espaço em branco no início da linha e à vírgula e ao espaço em branco no final da linha.
  • Os seguintes grupos (listados na ordem oposta acrescentam "17" mais o número correto de zeros com base em qual grupo foi correspondido na expressão de localização. Por exemplo, pegue o primeiro grupo (?{2}17$2). As ?{2}verificações para ver se o grupo 2 foi correspondido ou não . Nesse caso, insere o seguinte texto: “17” mais a correspondência do grupo 2, que deve ser um número de três dígitos.

informação relacionada