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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Регулярные Выражения Из Целого Слова  (Прочитано 11721 раз)
alexis031182
Гость
« Ответ #15 : Апрель 15, 2012, 16:38 »

Виноват, QRegExpValidator не для твоего случая. Спутал с другим классом.

А что касаемо замены в строке с использованием QRegExp, то там примерно такой алгоритм может быть:
Код:
QString file_data = ТЕКСТ_ДЛЯ_ПАРСИНГА;

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");

int pos = 0;
while((pos = reg_exp.indexIn(file_data, pos)) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
   file_data.replace(pos, res.length(), res);
   pos += reg_exp.matchedLength();
}
Тут плохо то, что каждый тип тега (a, img, div и т.п.) потребует нового перезапуска парсинга. Лучше как-то за один проход.
Записан
woka
Гость
« Ответ #16 : Апрель 15, 2012, 18:36 »

что то я совсем перестал понимать. если у нас регулярное выражение "\\'\\'\\'(.+)\\'\\'\\'", а текст '''aaa''' u '''bbb''', то на выходе мы получаем capture aaa''' u '''bbb. подскажите как сделать чтобы она заканчивался поиск при первом нахождении или что нибудь подобное. чтобы в результате было только ааа чтобы с этим можно было работать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #17 : Апрель 15, 2012, 19:10 »

Код
C++ (Qt)
QRegExp re;
re.setMinimal(true);
Записан

Изучением 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
woka
Гость
« Ответ #18 : Апрель 15, 2012, 21:01 »

Код:
QString file_data = ТЕКСТ_ДЛЯ_ПАРСИНГА;

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");

int pos = 0;
while((pos = reg_exp.indexIn(file_data, pos)) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
   file_data.replace(pos, res.length(), res);
   pos += reg_exp.matchedLength();
}
сразу мне ваш код понравился, но позже понял что он как то не так работает. вообщем я сделал так
Код:
  QRegExp b("\\'\\'\\'(.+)\\'\\'\\'");
    b.setMinimal(true);
      while(b.indexIn(conv) != -1){
          QString bb = "<b>"+b.cap(1)+"</b>";
          QString exbb = b.cap(0);
          conv.replace(exbb, bb);         
      }
спасибо
« Последнее редактирование: Апрель 15, 2012, 21:26 от woka » Записан
woka
Гость
« Ответ #19 : Апрель 15, 2012, 21:09 »

Виноват, QRegExpValidator не для твоего случая. Спутал с другим классом.

А что касаемо замены в строке с использованием QRegExp, то там примерно такой алгоритм может быть:
Код:
QString file_data = ТЕКСТ_ДЛЯ_ПАРСИНГА;

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");

int pos = 0;
while((pos = reg_exp.indexIn(file_data, pos)) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
   file_data.replace(pos, res.length(), res);
   pos += reg_exp.matchedLength();
}
Тут плохо то, что каждый тип тега (a, img, div и т.п.) потребует нового перезапуска парсинга. Лучше как-то за один проход.
у тебя как я понял выставляется позиция в цикле и при замене на этой позиции он и заменяет. как поправить код не знаю. хотя интересно
Записан
alexis031182
Гость
« Ответ #20 : Апрель 15, 2012, 23:02 »

Я не сообразил просто, что если replace делать сразу в тексте, то как бы позиция получается и не нужна, потому что первое попавшееся совпадение будет тут же заменено на новое значение, на которое reg_exp уже не сработает. Поэтому твой вариант лучше Улыбающийся

Единственное, от отслеживания текущей позиции можно выиграть в скорости, т.к. reg_exp при повторном заходе не будет смотреть весь текст с самого начала. Но это уже детали конечно, и раз не работает мой вариант, то похоже где-то в нём закрался ещё один косяк Улыбающийся
Записан
woka
Гость
« Ответ #21 : Апрель 16, 2012, 14:28 »

спасибо всем кто помог. благодоря вам научился пользоваться регулярными выражениями. вопрос считаю в полной мере решённым.
P.S. для тех кто пытается разобраться с регулярками: в демках qt есть пример RegExp с помощью которого можно протестировать  свои и понять что можно делать и как
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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