
У меня есть несколько текстовых файлов с чем-то похожим на следующие примеры:
{
{
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
У вас две проблемы:
- В строке замены
\d
означает "напечатать аd
" и ничего больше. Все специальные вещи регулярных выражений, такие как\d
и\w
и т. д., работают только в шаблоне поиска, а не в строке замены. - Как сказал @DavidPostill, Notepad++ не может выполнять математические операции при поиске/замене регулярных выражений.
У вас есть три варианта сделать то, что вы хотите:
- Используйте какую-нибудь программу, скрипт или плагин, чтобы сделать замены для вас. Любая версия этого, как говорится в предыдущем комментарии, здесь не по теме.
- Используйте Notepad++ для поиска и замены 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
- Оператор
$1
and$5
будет соответствовать пробелу в начале строки, а также запятой и пробелу в конце строки. - Следующие группы (перечислены в обратном порядке) добавляют «17» плюс правильное количество нулей в зависимости от того, какая группа была сопоставлена в выражении поиска. Например, возьмем первую группу
(?{2}17$2)
.?{2}
Проверяет, была ли сопоставлена группа 2 или нет. Если да, то вставляет следующий текст: «17» плюс совпадение для группы 2, которое должно быть трехзначным числом.