2

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

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

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

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

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

2 ответа2

3

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

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

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

  1. Используйте какую-нибудь программу, скрипт или плагин, чтобы сделать замену для вас. Любая версия этого, как сказано в предыдущем комментарии, не по теме.
  2. Используйте поиск Notepad++ и замените 3 раза.
    • Раунд один для одной цифры,
    • Раунд два для двух цифр, и
    • Раунд три для трех цифр.
  3. Если у вас Notepad++ больше, чем v6.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 или 3 цифрам. Опять же, () превратить его в группу захвата, второй на этот раз. И , наконец , соответствует запятая после чисел, что позволяет сохранить ее на той же строке в файле примера.

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

2

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

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

^(\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} ). Каждая группа сопровождается ? пометить его как возможно не соответствующий. Порядок групп важен, так как группы сопоставляются в порядке их появления. Если есть три цифры, первая группа будет соответствовать, и не останется никаких цифр для следующих двух групп, две из которых совпадают. Если есть две цифры, первая группа не будет соответствовать, вторая группа будет соответствовать, и первая группа не будет иметь никаких цифр для соответствия.

Объяснение замены-выражения

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .