crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3  
Ответить в данную темуНачать новую тему
Tonal
  опции профиля:
сообщение 30.8.2008, 0:08
Сообщение #21


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


1) Составляем выражение, которое найдёт последовательность символов которую нужно оставить:
[\d.]+[WC]?_O(N|FF)\b
Кстати, минус у чисел может быть?
И ещё куда-то нужно запятую присобачить - из примера не видно.
2) Создаём QRegExp с этим выражением.
3) Для исходной строки ищем все вхождения и собираем из них выходящую строку.

Вот реализация на python-е:
import re

def clear_str(str):
  regExp = re.compile(r'[\d.]+[WC]?_O(N|FF)\b')
  return ' '.join(regExp.findAll(str))

Думаю перевести на С++ труда не составит? :)

П.С. Приведённое выражение поймает и такую последовательность: 1.2.3.4.5._ON
Непонятно нужно ли с этим бороться...

Сообщение отредактировал Tonal - 30.8.2008, 0:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.8.2008, 13:38
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 30.8.2008, 1:08) *
1) Составляем выражение, которое найдёт последовательность символов которую нужно оставить:
[\d.]+[WC]?_O(N|FF)\b
Кстати, минус у чисел может быть?
И ещё куда-то нужно запятую присобачить - из примера не видно.
2) Создаём QRegExp с этим выражением.
3) Для исходной строки ищем все вхождения и собираем из них выходящую строку.

Вот реализация на python-е:
import re

def clear_str(str):
  regExp = re.compile(r'[\d.]+[WC]?_O(N|FF)\b')
  return ' '.join(regExp.findAll(str))

Думаю перевести на С++ труда не составит? :)

П.С. Приведённое выражение поймает и такую последовательность: 1.2.3.4.5._ON
Непонятно нужно ли с этим бороться...

Спасибо! :)
Либо точка, либо запятая.

Приведенное выражение вполне правильное! :) Знаков минус быть не может.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 1.9.2008, 12:38
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


небольшой вопрос. А как сделать с помощью регэкспа, чтобы он находил любую последовательность символов, не принадлежащую заданной?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.9.2008, 12:45
Сообщение #24


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


AD, всмысле инверсии чтоли?
если да, то так [^...] где многоточие - Р.В. которое надо исключить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 1.9.2008, 12:48
Сообщение #25


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Что такое "последовательность символов, не принадлежащую заданной"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 1.9.2008, 12:51
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 1.9.2008, 13:48) *
Что такое "последовательность символов, не принадлежащую заданной"?

Я опять объяснил криво, видимо. Простите.
Я имел в виду с помощью регэкспа найти символы, не принадлежащие выражению
[\d.]+[WC]?_O(N|FF)\b.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 1.9.2008, 13:31
Сообщение #27


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Ты опять криво выразился. Прочитай что-нибудь про регэкспы. :)
В регулярном выражении существует понятие класса символов. На принадлежность или непринадлежность какому-нибудь классу символ можно тестировать.
А вот принадлежность символа какому-нибудь произвольному регэкспу не определена. Например символ W и принадлпжит или нет в зависимости от того, какие символы его окружают.
Можно тестировать строку на совпадение с регуляркой, но опять же например сторока C_ON с ней не совпадёт.

Тут всё опять зависит от того, что ты хочешь сделать.
Если таки убрать из текста всё лишнее, как описывал, то алгоритм я тебе уже нарисовал. Правда т.к. в QRegExp нет findall, придётся выписать цикл явно (см. пример к "Capturing Text").

П.С. Есть ещё позитивный и негативный предпросмотр, но с ним лучше не связываться, пока не разобрался нормально. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 1.9.2008, 15:57
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Практически сделал, осталось добиться последнего.
Чтобы в строке подобного рода выражения [\\d.]+[WC]?_O(N|FF)\\b можно было встретить большое количество раз. А то, он вырезает только первое подобное выражение из строки, а все сотальные, удовлетворяющие заданному регулярному выражению, затирает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.9.2008, 16:34
Сообщение #29


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(AD @ 1.9.2008, 19:57) *
, а все сотальные, удовлетворяющие заданному регулярному выражению, затирает

ЗАТИРАЕТ?
наверное правильнее сказать не возвращает.
тебе надо указатель дальше двигать по тексту, типа этого
rx.indexIn(text, pos)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 10.9.2008, 15:30
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Извините, забыл сразу выложить код, как я реализовал. Вот сейчас выкладываю:
source

/// Удаление из имени событий всех событий, отвечающим фильтру - "Другие"
void ScrTrack::deleteOther(EVENT_NAME* evn)
{
    QRegExp rx("[\\d.|,]+[WC]?_O(N|FF)\\b");
    QRegExp reg("[\\d.|,]"), reg1("[_]"), reg2("[O]"), reg3("[N|FF]");
    QString result_string = "";
    bool t = (evn -> ev_name.find(" ") == -1) ? false : true;
    int pos = 0;
    while((pos = rx.indexIn(evn -> ev_name, pos)) != -1)
    {
        if(!t){ result_string = evn -> ev_name; break; }
        QStringList l1=rx.capturedTexts();
        for(QList<QString>::iterator iter=l1.begin(); iter!=l1.end(); ++iter)
        {
            int _if = iter -> find(reg), _if1 = iter -> find(reg1), _if2 = iter -> find(reg2), _if3 = iter -> find(reg3);
            if(iter -> find(reg) == -1 || iter -> find(reg1) == -1 || iter -> find(reg2) == -1
                || iter -> find(reg3) == -1) continue;
            result_string += *iter;
            result_string += "   ";
        }
        pos += rx.matchedLength();
    }

    evn -> ev_name = result_string.simplified();
    if(evn -> ev_name.find(rx) != -1)
    {
        if(evn -> ev_name.find(" ") == -1 && t)
        {
            double fs = getMode(evn);
            evn -> mode = fs + 100;
        }
        else if(evn -> ev_name.find(" ") != -1)
        {
            double fs = getMode(evn, true);
            evn -> mode = fs + 100;
        }
    }
}


Регэксп rx - это регэксп, который определяет те последовательности символов, которые следует оставить. Ну а далее, путем сравнений - это реализовано!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 30.5.2025, 13:29