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

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

Страниц: [1] 2 3 ... 18   Вниз
  Печать  
Автор Тема: Регулярное выражение с QString  (Прочитано 159087 раз)
Spark
Гость
« : Июль 24, 2013, 21:24 »

Это срабатывает:
Код
C++ (Qt)
QString trimmedStr;
...
QRegExp rx(trimmedStr);

Это не рабоатет:
Код
C++ (Qt)
QString trimmedStr;
...
QRegExp rx("\\b(" + trimmedStr + ")\\b");

Возможно ли это?
« Последнее редактирование: Июль 24, 2013, 21:26 от Spark » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Июль 24, 2013, 21:28 »

что находится в строке и что показывает QRegExp::indexIn() мы должны угадать?
Записан
Spark
Гость
« Ответ #2 : Июль 24, 2013, 21:41 »

Простейший частотный анализ текста:

Код
C++ (Qt)
void MainWindow::bufferButtonSave()
{
   QClipboard *clipboard = QApplication::clipboard();
   QString originalText = clipboard->text();
 
   originalText.replace(QRegExp("\\W"), " ");
   originalText.replace(QRegExp("\\d"), " ");
 
       QTextStream fileStream( & originalText );
       QString itemStr, trimmedStr;
       QList< QString > itemList;
 
       QString nnn;
 
 
       text.clear();
 
       do
       {
           // Пословно
           fileStream >>(itemStr);
           // Построчно
//            itemStr = fileStream.readLine();
 
           trimmedStr = itemStr.trimmed();
 
           QRegExp rx(trimmedStr);
 
           int coun(0);
           int pos = 0;
           while ((pos = rx.indexIn(originalText, pos)) != -1)
           {
               ++coun;
               pos += rx.matchedLength();
           }
 
           nnn.setNum(coun);
           trimmedStr = trimmedStr + nnn;
           itemList.prepend( trimmedStr );
 
       } while( !fileStream.atEnd() );
 
       history.enableAdd( true );
 
       for( QList< QString >::const_iterator i = itemList.constBegin(); i != itemList.constEnd(); ++i )
           text.addItem( Text::Item( 1, *i ) );
 
       text.enableAdd( cfg.preferences.storeText );
}

Честно говоря и первый вариант не работает. Но вроде срабатывал. Может показалось. А может уже где накуралесил и не могу определить ошибку.
« Последнее редактирование: Июль 24, 2013, 21:47 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #3 : Июль 24, 2013, 21:52 »

где пример входных и выходных данных? сам хоть пробовал ставить qDebug чтобы смотреть что там происходит?

частотный анализ чего — слов?
Записан

Изучением 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
Spark
Гость
« Ответ #4 : Июль 24, 2013, 22:09 »

где пример входных и выходных данных? сам хоть пробовал ставить qDebug чтобы смотреть что там происходит?

частотный анализ чего — слов?
Да слов.
qDebug не пробовал и не знаю как.
В общем то нашел ошибку. Под утро уже устал. Работает:
Код
C++ (Qt)
void MainWindow::bufferButtonSave()
{
   QClipboard *clipboard = QApplication::clipboard();
   QString originalText = clipboard->text();
 
   originalText.replace(QRegExp("\\W"), " ");
   originalText.replace(QRegExp("\\d"), " ");
 
       QTextStream fileStream( & originalText );
       QString itemStr, trimmedStr;
       QList< QString > itemList;
 
       QString nnn;
 
 
       text.clear();
 
       do
       {
           // Пословно
           fileStream >>(itemStr);
           // Построчно
//            itemStr = fileStream.readLine();
 
           trimmedStr = itemStr.trimmed();
 
           QRegExp rx(trimmedStr);
 
           int coun(0);
           int pos = 0;
           while ((pos = rx.indexIn(originalText, pos)) != -1)
           {
               ++coun;
               ++pos;
           }
 
           nnn.setNum(coun);
           trimmedStr = trimmedStr + nnn;
           itemList.prepend( trimmedStr );
 
       } while( !fileStream.atEnd() );
 
       text.enableAdd( true );
 
       for( QList< QString >::const_iterator i = itemList.constBegin(); i != itemList.constEnd(); ++i )
           text.addItem( Text::Item( 1, *i ) );
 
       text.enableAdd( cfg.preferences.storeText );
}

На входе:
Цитировать
где пример входных и выходных данных? сам хоть пробовал ставить qDebug чтобы смотреть что там происходит?

частотный анализ чего — слов?
На выходе:
Цитировать
где1
пример1
входных1
и1
выходных1
данных1
сам1
хоть1
пробовал1
ставить1
qDebug1
чтобы1
смотреть1
что1
там1
происходит1
частотный1
анализ1
чего1
слов1
40
Пока только не ясно, что за цифра в конце выскакивает. Что то лишнее считает.
« Последнее редактирование: Июль 24, 2013, 22:31 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #5 : Июль 24, 2013, 22:37 »

Цитировать
qDebug не пробовал и не знаю как.
открою секрет: http://qt-project.org/doc/qt-4.8/qtglobal.html#qDebug

зачем пробегать по строкам списка через итератор если есть foreach, который укорачивает написание в 2-3 раза?

и кстати вместо QList< QString > можно писать просто QStringList.
Записан

Изучением 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
Spark
Гость
« Ответ #6 : Июль 24, 2013, 22:44 »

Цитировать
qDebug не пробовал и не знаю как.
открою секрет: http://qt-project.org/doc/qt-4.8/qtglobal.html#qDebug

зачем пробегать по строкам списка через итератор если есть foreach, который укорачивает написание в 2-3 раза?

и кстати вместо QList< QString > можно писать просто QStringList.
Спасибо за помощь. Переделаю.
А не подскажете, что за цифра в конце выскакивает?
Если вывожу список без частотного анализа и сравниваю с похожей программой, то количество слов (пунктов) для подсчета совпадает. Ввел частотный анализ, на один пункт (цифра в конце) больше.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #7 : Июль 24, 2013, 23:05 »

нет, не подскажу. наверное это цифра 4 с дописанным к ней 0, а не просто число 40. бери qDebug и вперед Подмигивающий
Записан

Изучением 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


Просмотр профиля
« Ответ #8 : Июль 25, 2013, 09:57 »

Простейший частотный анализ текста:
Что-то он у Вас не выглядит простым  Улыбающийся Что нужно? Посчитать частоту слов разделенных пробелами? Это легко сделать напр так
Код
C++ (Qt)
QString src = "This is a text"
QMap <QString, int> theMap;
QStringList lst = src.split(" ");
for (int i = 0; i < lst.size(); ++i)
++theMap[lst[i]];
 
Из Вашего кода трудно понять чего Вы хотите добиться.

Также плохо совать это в MainWindow, как говорят "смешивать бизнес-логику с UI". Каждый начинает с соображений типа "тааа... ото заводить файл, да еще и хедер - напишу прямо здесь - и все дела". Но рано или поздно все приходят к "разложить все по полочкам". Плэтому лучше рано  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Июль 25, 2013, 10:16 »

Это легко сделать напр так
Легко, но не оптимально: первый проход по строке для разбиения по словам, второй проход по уже разбитым словам. Лучше все делать в один проход.


Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июль 25, 2013, 10:28 »

Легко, но не оптимально: первый проход по строке для разбиения по словам, второй проход по уже разбитым словам. Лучше все делать в один проход.
То да, правду сказать, split - метод лошарный. По-хорошему надо строить что-то типа NextToken, здесь лучше NextWord. Но Вы меня уже затравили обвинениями в велосипедизме - поэтому так  Улыбающийся
Записан
Spark
Гость
« Ответ #11 : Июль 25, 2013, 10:37 »

Простейший частотный анализ текста:
Что-то он у Вас не выглядит простым  Улыбающийся Что нужно? Посчитать частоту слов разделенных пробелами? Это легко сделать напр так
Код
C++ (Qt)
QString src = "This is a text"
QMap <QString, int> theMap;
QStringList lst = src.split(" ");
for (int i = 0; i < lst.size(); ++i)
++theMap[lst[i]];
 
Из Вашего кода трудно понять чего Вы хотите добиться.

Также плохо совать это в MainWindow, как говорят "смешивать бизнес-логику с UI". Каждый начинает с соображений типа "тааа... ото заводить файл, да еще и хедер - напишу прямо здесь - и все дела". Но рано или поздно все приходят к "разложить все по полочкам". Плэтому лучше рано  Улыбающийся

Спасибо за советы. Что смогу то постараюсь учесть.
Я не имел ввиду простоту кода.
Если же все таки по нему. То за расчет частоты там не так много отвечает.
Эта фукция отвечает за (думаю и так все ясно):
- Взять любой текст из буфера обмена.
Пословная ветка:
- Заменить все не алфавитные символы на пробелы.
- В цикле сформировать список и заодно посчитать частоту повтора слов. Пробелы слева справа убрать.
- Далее из списка формируется реальная панель со списком слов и частотой употребления. Отправка каждого слова идет уже в другую функцию.
Построчная ветка: Эта часть просто берет каждую строку и формирует список для пользователя без частотного анализа.
Вот так это выглядит:

Если ваш код снабдить всем необходимым, будет ли он проще? Попробую разобраться и оценить Улыбающийся.

Пока все работает, за исключением не понятной циферки.
На счет qDebug. На сколько понял. Это просто ставить вывод где хочу и куда хочу для отслеживания стуации и компилировать в Дебаг режиме. Компиляция не получается. Запуск программы вылетает с неожиданной ошибкой.
« Последнее редактирование: Июль 25, 2013, 10:42 от Spark » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Июль 25, 2013, 10:40 »

Но Вы меня уже затравили обвинениями в велосипедизме - поэтому так  Улыбающийся
Причем здесь велосипедизм, все легко делается в цикле типа:
Код
C++ (Qt)
while ((pos = rx.indexIn(originalText, pos)) != -1)
{
   ...
}
 
Как и было у автора темы.
Записан
Spark
Гость
« Ответ #13 : Июль 25, 2013, 10:47 »

Может все таки кто нибудь опытным взглядом оценит почему внизу списка дополнительный пункт - просто цифра. Что у меня еще считается? Конечно разберусь, но может кто сможет сразу сказать, что не так?
Предчувствие, что заодно считает начало и конц каждого слова Улыбающийся. Что то напутал с регеспом.
« Последнее редактирование: Июль 25, 2013, 10:51 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июль 25, 2013, 11:48 »

Отлаживайтесь, напр так
Код
C++ (Qt)
nnn.setNum(coun);
if (coun == 40)
qDebug()  << "opa!  " << trimmedStr;
 
Возможно trimmedStr пустая

Вообще зачем так делать - искать по каждой число ее вхождений?  Это имело бы смысл если словарь задан извне, а если все на руках - да просчитали частоту и сложили в мапу. Нужно вывести по порядку - просто QStringList - (можно тот же самый что вернул split) и из мапы достаете частоту, напр
Код
C++ (Qt)
for (int i = 0; i < lst.size(); ++i)
qDebug()  << lst[i] << "  " << theMap[lst[i]];
 
Записан
Страниц: [1] 2 3 ... 18   Вверх
  Печать  
 
Перейти в:  


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