Russian Qt Forum
Ноябрь 25, 2024, 14:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Регулярки  (Прочитано 13493 раз)
Bepec
Гость
« Ответ #15 : Май 19, 2015, 16:05 »

хм. удалить можно, используя предпросмотр назад и вперед.

Т.е. (?<=arm_..)* найдёт лишь 1 и 2. Ну и зная их позиции спокойно удаляем.

ссылка на вики, раздел "Просмотр вперёд и назад"

https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F#.D0.93.D1.80.D1.83.D0.BF.D0.BF.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0_.D0.B1.D0.B5.D0.B7_.D0.BE.D0.B1.D1.80.D0.B0.D1.82.D0.BD.D0.BE.D0.B9_.D1.81.D0.B2.D1.8F.D0.B7.D0.B8

PS в Qt4 QRegExp не поддерживал эту возможность.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #16 : Май 19, 2015, 17:51 »

в «регулярном» режиме это делается легко через захват числа в () и QRegExp::pos()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Май 20, 2015, 08:34 »

в «регулярном» режиме это делается легко через захват числа в () и QRegExp::pos()
Но не в wildcard режиме. Ну ничего, перебьются

Т.е. (?<=arm_..)* найдёт лишь 1 и 2. Ну и зная их позиции спокойно удаляем.
Ну расчет на юзера который может и про джокер-звездочку никогда не слыхал - он вводит пвттерн
Записан
Bepec
Гость
« Ответ #18 : Май 20, 2015, 10:30 »

Ну так напишите собственный псевдоязык.
А дальше уже преобразуйте в regExp.

PS какой то язык пользователь всё равно должен будет запомнить, иначе не сможет работать с программой.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #19 : Май 20, 2015, 16:03 »

Хотелось бы иметь возможность "удалять слово". Пример
Цитировать
arm_lo 1
arm_hi 2
Найти легко, паттерн  "arm_* *". Но как мне удалить номера (1, 2)?

Ну если именно с помощью регекспов, то первое, что в голову пришло:
Код
C++ (Qt)
   QRegExp re("(arm_\\w+)( \\d+)");
   QString test("arm_lo 12");
   int i = re.indexIn(test);
   if (i >= 0) {
       QString corrected = test;
       corrected.remove(i + re.cap(1).length(), re.cap(2).length());
       qDebug() << corrected;
   }
 
Но тут уже не Wildcard matching.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Май 20, 2015, 16:58 »

Ну так напишите собственный псевдоязык.
А дальше уже преобразуйте в regExp.
Были мысли в этом направлении ("решетка"), но отказался - при малейшем наращивании ф-ционала светит "тот самый велосипед"

PS какой то язык пользователь всё равно должен будет запомнить, иначе не сможет работать с программой.
Ну я пользовался "звездочкой" в Norton Commander не подозревая о существовании регулярок.

Ну если именно с помощью регекспов, то первое, что в голову пришло:
Код
C++ (Qt)
   QRegExp re("(arm_\\w+)( \\d+)");
   QString test("arm_lo 12");
   int i = re.indexIn(test);
   if (i >= 0) {
       QString corrected = test;
       corrected.remove(i + re.cap(1).length(), re.cap(2).length());
       qDebug() << corrected;
   }
 
Но тут уже не Wildcard matching.
А как юзверь в UI введет "двойку" которая нужна для cap(2) ?

Хорошо, пусть более скромная задача
Цитировать
ren *.cpp *.cp1
Это работает напр в Far. Как добиться того же? Т.е. юзер вводит
Цитировать
Search for: *.cpp
Replace with: *.cp1
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #21 : Май 20, 2015, 17:06 »

как преобразовать вайлдкард в полноценную регулярку я уже писал, разберем на примере:
1) вайлдкард *.cpp превращаем в регулярку (.+)\.cpp (можно и .* вместо .+, но вряд ли нас интересуют файлы с пустым именем: ".cpp")
2) имя файла в rx.cap(1)
3) результат: rx.cap(1) + ".cp1"
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #22 : Май 20, 2015, 17:17 »

Вы опять хотите чтобы пользователь без знания wildcard regexp и простейшего псевдоязыка мог пользоваться вашей программой? Мечтатель Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Май 20, 2015, 17:58 »

как преобразовать вайлдкард в полноценную регулярку я уже писал, разберем на примере:
1) вайлдкард *.cpp превращаем в регулярку (.+)\.cpp (можно и .* вместо .+, но вряд ли нас интересуют файлы с пустым именем: ".cpp")
2) имя файла в rx.cap(1)
3) результат: rx.cap(1) + ".cp1"
Та же проблема что и в ответе Kurles, только 1 вместо 2. Но ведь может быть и так
Цитировать
ren test.c* test1.c*
или так
Цитировать
ren *.c* *.cpp
« Последнее редактирование: Май 20, 2015, 18:02 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #24 : Май 20, 2015, 19:16 »

где проблема? каждую звездочку мы заменяем на (.+), индексы для cap() начиная с 1 — это номер скобок если считать слева направо.

"asd(.+)qwe(.+)zxc" совпадет например с "000asd123qwe321zxcлрнпии", где rx.cap(0) = asd123qwe321zxc (полное совпадение), rx.cap(1) = 123, rx.cap(2) = 321

для ren *.c* *.cpp браться будет только rx.cap(1)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Май 21, 2015, 06:09 »

где проблема? каждую звездочку мы заменяем на (.+), индексы для cap() начиная с 1 — это номер скобок если считать слева направо.

"asd(.+)qwe(.+)zxc" совпадет например с "000asd123qwe321zxcлрнпии", где rx.cap(0) = asd123qwe321zxc (полное совпадение), rx.cap(1) = 123, rx.cap(2) = 321

для ren *.c* *.cpp браться будет только rx.cap(1)
Да, мы можем выцепить все куски которые найдены на месте джокеров - ну а толку? Это же совсем не значит что все их надо менять, это определяется выходным паттерном задаваемым пользователем (replace with). Тот же пример
Цитировать
ren test.c* test1.c*
Требуется заменить test на test1. Какому cap(?) он соответствует?
Еще пример
Цитировать
ren test*.c*  tst0.c1
А здесь устраивает и та замена что в QString - но как это вычислить?

Edit: более четко можно сформулировать так. Пусть есть строка поиска
Цитировать
Search for: test*.c*
Но по ней мы ничего еще заменять не можем. В зависимости от строки замены
Цитировать
Replace with: test1.c*
Replace with: test*.cpp
Replace with: test.c
Это будут 3 разные замены. И все они работают в командной строке, Far и др. Может это вообще не регулярки  Непонимающий

По классике
Цитировать
Вот так всю жизнь и проживешь без собаки ...
Улыбающийся
« Последнее редактирование: Май 21, 2015, 10:18 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #26 : Май 21, 2015, 10:23 »

Цитировать
Может это вообще не регулярки
естественно нет, это вайлдкарды

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Май 23, 2015, 08:15 »

Цитировать
Может это вообще не регулярки
естественно нет, это вайлдкарды
Ну вот, как только я хочу воспользоваться готовым, проверенным решением - ни фига  Плачущий
Пришлось сделать самому (аттач). Попинайте

Edit: исправил бажок, обновил (2)
« Последнее редактирование: Май 23, 2015, 10:05 от Igors » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 23.