Объяснение Find-Expression

Объяснение Find-Expression

У меня есть несколько текстовых файлов с чем-то похожим на следующие примеры:

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

Мне было интересно, как можно выполнить массовый поиск по нескольким файлам и заменить их следующим образом:

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

в основном я бы прибавлял 17000 к каждому из первых чисел после каждой двойной открывающейся скобки. Я пробовал использовать \d\d\d для замены чисел на 17\d\d\d, но тогда это давало бы мне 17ddd — букву, а не число. Помогите, пожалуйста

решение1

У вас две проблемы:

  1. В строке замены \dозначает "напечатать а d" и ничего больше. Все специальные вещи регулярных выражений, такие как \dи \wи т. д., работают только в шаблоне поиска, а не в строке замены.
  2. Как сказал @DavidPostill, Notepad++ не может выполнять математические операции при поиске/замене регулярных выражений.

У вас есть три варианта сделать то, что вы хотите:

  1. Используйте какую-нибудь программу, скрипт или плагин, чтобы сделать замены для вас. Любая версия этого, как говорится в предыдущем комментарии, здесь не по теме.
  2. Используйте Notepad++ для поиска и замены 3 раза.
    • Раунд первый для однозначного числа,
    • Раунд два для двух цифр, и
    • Округлите три раза до трех цифр.
  3. Если у вас Notepad++ выше версии 6.0, вы можете использовать синтаксис PCRE в регулярном выражении и использоватьотличный ответот @ACR, чтобы сделать все это за один проход.

Чтобы сделать это в трехпроходном методе, используйте следующие шаги. Возможно, вам придется изменить шаблоны поиска, чтобы перехватывать то, что вы хотите, и только то, что вы хотите. Они работают в образце, который вы предоставили выше, но ваши файлы могут быть сложнее образца.

Первый раунд

Найдите это:

(\s+)(\d),

Заменить на это:

\11700\2,

Второй раунд

Найдите это:

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

Заменить на это:

\1170\2,

Раунд третий

Найдите это:

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

Заменить на это:

\117\2,

Что оно делает

В Find thisшаблоне \s+находит все пробелы, которые могут быть найдены перед следующим токеном, требуя по крайней мере один, чтобы предотвратить сопоставление числа, следующего за чем-либо, кроме пробела. ()Вокруг него делают его первой захваченной строкой, возвращаемой сопоставлением. Соответствует \dодной цифре, а группы \d\dи \d\d\dзаставляют его соответствовать 2 или трем цифрам, ровно, вместо этого. Опять же, ()превращают его в захватывающую группу, на этот раз вторую. Наконец , ,соответствует запятой после чисел, что сохраняет его на той же строке в вашем файле образца.

В Replace with thisзаменяется \1первой группой захвата (пробелами). 1700, 170, и 17печатает часть, которую нужно добавить к строке. Заменяется \2второй группой захвата, которая является цифрой(ами), которая есть в шаблоне поиска. Наконец, запятая ,явно заменяется, вместо того, чтобы тратить на нее группу захвата.

решение2

Вы можете сделать это с помощью одного поиска и замены. Notepad++ позволяет вам делать условную замену на основе того, совпала ли группа.

Найти то, что:

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

Заменить:

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

Объяснение Find-Expression

Двигаясь от внешних сторон вовнутрь:

  • Символы ^и $обозначают начало и конец строки соответственно.
  • Символ (\s*)соответствует пробелу в начале, а символ (,\s*)соответствует запятой и любому завершающему пробелу в конце строки.
  • В середине у нас есть три разные группы для сопоставления 3, 2 или 1 цифр (используя синтаксис {n}). За каждой группой следует , ?чтобы отметить ее как возможно не совпадающую. Порядок групп важен, так как группы сопоставляются в том порядке, в котором они появляются. Если есть три цифры, первая группа совпадет, и не останется цифр для следующих двух групп два совпадения. Если есть две цифры, первая группа не совпадет, вторая группа совпадет, и в первой группе не будет никаких цифр для сопоставления.

Объяснение Replace-Expression

  • Оператор $1and $5будет соответствовать пробелу в начале строки, а также запятой и пробелу в конце строки.
  • Следующие группы (перечислены в обратном порядке) добавляют «17» плюс правильное количество нулей в зависимости от того, какая группа была сопоставлена ​​в выражении поиска. Например, возьмем первую группу (?{2}17$2). ?{2}Проверяет, была ли сопоставлена ​​группа 2 или нет. Если да, то вставляет следующий текст: «17» плюс совпадение для группы 2, которое должно быть трехзначным числом.

Связанный контент