1743 / 663 / 87
Регистрация: 01.10.2012
Сообщений: 3,279
1

Замена подстрок по образцу команды rename

21.05.2015, 06:51. Показов 657. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

Потребовалось сделать простенький диалог для поиска и переименования объектов в списке (которых может быть много). Пользователь задает строку поиска и строку замены. Строки могут содержать wildcadrs (*, ?). Грубо говоря "нужно сделать как в Far, команде rename" (и др подобных оболочках).

Я много слышал о "регулярных выражениях" и их неукротимой мощи и полагал что мне надо лишь "воспользоваться готовым". Действительно, прицепив QRegExp с поиском проблем нет. Но вот с заменой - можно заменить только на фиксированную строку - и все. А хотелось бы так, примеры
ren *.c* *.cpp
ren test*.c* test.c*
Для пользователя это выглядит так
Search for: *.c*
Replace with: *.cpp
Как этого добиться?

С уважением
Игорь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2015, 06:51
Ответы с готовыми решениями:

Замена подстрок
Здравтсвуйте. Подскажите пожалуйста как в тексте заменить один кусок текста на другой, всё должно...

Замена подстрок в строке
Кто знает, как в данной строке заменить все подстроки "123" на "456"?

Замена подстрок в файле
Ввести последовательность строк из текстового по-тока и выполнить указанные действия. При этом...

Нахождение подстрок и их замена.
"Поиск в строке всех вхождений подстрок и их(всех повторений подстроки) на другую...

9
Модератор
2980 / 2133 / 451
Регистрация: 26.03.2015
Сообщений: 8,300
21.05.2015, 15:08 2
QString::replace(const QRegExp &, const QString &)

Добавлено через 14 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
можно заменить только на фиксированную строку
Как замена может быть не фиксированной?

ren *.c* *.cpp
Вы ищите ".c*" и заменяете на ".cpp"

ren test*.c* test.c*
Вы ищите "test*.c" и заменяете на "test.c"

Добавлено через 8 минут
C#
1
2
3
4
5
6
7
//ren *.c* *.cpp
Console.WriteLine(new Regex(@".c\w*").Replace("test1.c1, test2.c2", ".cpp")); 
// Результат: test1.cpp, test2.cpp
 
//ren test*.c* test.c*
Console.WriteLine(new Regex(@"test\w*.c").Replace("test1.c1, test2.c2", "test.c")); 
// Результат: test.c1, test.c2
0
1743 / 663 / 87
Регистрация: 01.10.2012
Сообщений: 3,279
21.05.2015, 15:18  [ТС] 3
Цитата Сообщение от Shamil1 Посмотреть сообщение
Как замена может быть не фиксированной?
Строка поиска задает что найти, напр
Search for: test*.c*
А строка замены определяет что заменить, напр
Replace with: test1.c*
Replace with: test*.cpp
Replace with: test.c
Это 3 разные замены. Если бы можно было явно указать "что менять из найденного" - тогда все бы и свелось к фиксированному тексту. А надо как-то выдернуть это из паттерна замены
0
Модератор
2980 / 2133 / 451
Регистрация: 26.03.2015
Сообщений: 8,300
21.05.2015, 15:52 4
Это отдельная задача. И для начала нужно её сформулировать.
Вы можете описать, что должна выдавать функция "getPattern" на выходе? (для всех возможных входов)

Добавлено через 2 минуты
Например, если пользователь напишет:
ren test*.c* foo*boo*
0
1743 / 663 / 87
Регистрация: 01.10.2012
Сообщений: 3,279
21.05.2015, 16:00  [ТС] 5
Цитата Сообщение от Shamil1 Посмотреть сообщение
Это отдельная задача. И для начала нужно её сформулировать.
Вы можете описать, что должна выдавать функция "getPattern" на выходе? (для всех возможных входов)
Добавлено через 2 минуты
Например, если пользователь напишет:
ren test*.c* foo*boo*
Так напишите в консоли и посмотрите (создав сначала подходящий файл).

Не всегда есть детальная формальная постановка, более того это бывает относительно редко. В данном случае нужно "сделать по образцу" (хорошо еще общедоступному), о чем и сказано в названии топика. Это нормально
0
Модератор
2980 / 2133 / 451
Регистрация: 26.03.2015
Сообщений: 8,300
21.05.2015, 17:58 6
Цитата Сообщение от Igor3D Посмотреть сообщение
Так напишите в консоли и посмотрите (создав сначала подходящий файл).
Команда "ren *.c* foo*boo*" заменяет первые три символа в имени файла на "foo", а к расширению файла добавляет "boo".

Добавлено через 1 минуту
myfile.c1 -> fooile.c1boo

Добавлено через 1 час 8 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
В данном случае нужно "сделать по образцу" (хорошо еще общедоступному), о чем и сказано в названии топика.
Вот я и говорю, что это отдельная задача, не имеющая никакого отношения к регулярным выражениям.

Команда ren использует первый параметр для поиска, а второй праметр - для задания нового имени. То есть, новое имя файла никак не зависит от первого параметра.

Таким образом, Вам нужно:
1. Найти объекты, которые нужно переименовать, используя RegEx и первый параметр.
2. Вычислить для найденных объектов новые имена, используя соответсвующий алгоритм...
3. Переименовать объекты

Замечания по пункту 2:
1. Придётся написать свою функцию... либо найти готовую в интернете
2. Не факт, что windows и far используют одинаковый алгоритм

з.ы.
Подробное описание того, как работает rename можно найти здесь:
http://superuser.com/questions... -wildcards
Там же можно найти код функций, которые (по заверениям их авторов) реализуют данный алгоритм.
1
1743 / 663 / 87
Регистрация: 01.10.2012
Сообщений: 3,279
21.05.2015, 18:11  [ТС] 7
Цитата Сообщение от Shamil1 Посмотреть сообщение
Таким образом, Вам нужно:
...
2. Вычислить для найденных объектов новые имена, используя соответсвующий алгоритм...
...
1. Придётся написать свою функцию... либо найти готовую в интернете
Так я ж с этим никак не спорю - для того и топик создал

Цитата Сообщение от Shamil1 Посмотреть сообщение
Подробное описание того, как работает rename можно найти здесь:
http://superuser.com/questions... -wildcards
Там же можно найти код функций, которые (по заверениям их авторов) реализуют данный алгоритм.
Был я на этой странице сегодня - ну исходники не те что "надо брать". Ну хоть что-то про алгоритм. Тут типовая проблема - трудно нагуглить т.к. все бросаются пояснять как работают * и ?, не пробиться через кучу этого мусора.

Спасибо за участие
0
Модератор
2980 / 2133 / 451
Регистрация: 26.03.2015
Сообщений: 8,300
21.05.2015, 19:44 8
Цитата Сообщение от Igor3D Посмотреть сообщение
Так я ж с этим никак не спорю - для того и топик создал
Упоминание регулярных выражений сбило меня с толку.

Цитата Сообщение от Igor3D Посмотреть сообщение
Ну хоть что-то про алгоритм.
Алгоритм на той странице, вроде, подробно расписан, и реализовать его не займёт много времени?
0
1743 / 663 / 87
Регистрация: 01.10.2012
Сообщений: 3,279
23.05.2015, 07:38  [ТС] 9
Цитата Сообщение от Shamil1 Посмотреть сообщение
Алгоритм на той странице, вроде, подробно расписан, и реализовать его не займёт много времени?
Да, все получилось. Нужно было только внимательно прочитать (вместо лазания по гугле )
0
6434 / 1765 / 300
Регистрация: 10.12.2013
Сообщений: 6,221
30.12.2016, 03:40 10
Цитата Сообщение от Igor3D Посмотреть сообщение
Bash
1
ren test*.c* test.c*
неохота поднимать вирт. машину и проверять,
но память мне нашёптывает, под OpenVMS такой wildcard срабатывал.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2016, 03:40
Помогаю со студенческими работами здесь

Поиск и замена подстрок в строке
"Поиск в строке всех вхождений подстрок и их(всех повторений подстроки) на другую...

Замена всех подстрок в строках
Подскажите , пожалуйста, как решить реальную задачу: С сервера на терминал передается несколько...

Случайная замена нескольких подстрок
Здравствуйте! Столкнулся с такой интересной задачей... 1. есть строка, например: "Привет, это...

Замена подстрок, которые не в кавычках
Здравсуйте! Имются произвольные строки, которые нужно переводить на другой язык. Однако в строках...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru