crossplatform.ru

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


  Ответ в Правильное написание regexp
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 10.9.2008, 15:30
  Извините, забыл сразу выложить код, как я реализовал. Вот сейчас выкладываю:
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 - это регэксп, который определяет те последовательности символов, которые следует оставить. Ну а далее, путем сравнений - это реализовано!
Litkevich Yuriy Дата 1.9.2008, 16:34
 
Цитата(AD @ 1.9.2008, 19:57) *
, а все сотальные, удовлетворяющие заданному регулярному выражению, затирает

ЗАТИРАЕТ?
наверное правильнее сказать не возвращает.
тебе надо указатель дальше двигать по тексту, типа этого
rx.indexIn(text, pos)
AD Дата 1.9.2008, 15:57
  Практически сделал, осталось добиться последнего.
Чтобы в строке подобного рода выражения [\\d.]+[WC]?_O(N|FF)\\b можно было встретить большое количество раз. А то, он вырезает только первое подобное выражение из строки, а все сотальные, удовлетворяющие заданному регулярному выражению, затирает.
Tonal Дата 1.9.2008, 13:31
  Ты опять криво выразился. Прочитай что-нибудь про регэкспы. :)
В регулярном выражении существует понятие класса символов. На принадлежность или непринадлежность какому-нибудь классу символ можно тестировать.
А вот принадлежность символа какому-нибудь произвольному регэкспу не определена. Например символ W и принадлпжит или нет в зависимости от того, какие символы его окружают.
Можно тестировать строку на совпадение с регуляркой, но опять же например сторока C_ON с ней не совпадёт.

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

П.С. Есть ещё позитивный и негативный предпросмотр, но с ним лучше не связываться, пока не разобрался нормально. :)
AD Дата 1.9.2008, 12:51
 
Цитата(Tonal @ 1.9.2008, 13:48) *
Что такое "последовательность символов, не принадлежащую заданной"?

Я опять объяснил криво, видимо. Простите.
Я имел в виду с помощью регэкспа найти символы, не принадлежащие выражению
[\d.]+[WC]?_O(N|FF)\b.
Tonal Дата 1.9.2008, 12:48
  Что такое "последовательность символов, не принадлежащую заданной"?
Litkevich Yuriy Дата 1.9.2008, 12:45
  AD, всмысле инверсии чтоли?
если да, то так [^...] где многоточие - Р.В. которое надо исключить
AD Дата 1.9.2008, 12:38
  небольшой вопрос. А как сделать с помощью регэкспа, чтобы он находил любую последовательность символов, не принадлежащую заданной?
AD Дата 30.8.2008, 13:38
 
Цитата(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
Непонятно нужно ли с этим бороться...

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

Приведенное выражение вполне правильное! :) Знаков минус быть не может.
Tonal Дата 30.8.2008, 0: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
Непонятно нужно ли с этим бороться...
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.4.2024, 22:26