Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2013, 23:46   #1
Matras
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 32
По умолчанию Разобрать модификацию Regex

Здравствуйте, помогите пожалуста, не могу разобрать такую вот запись
"Valencia 7x17/5x112 D70.1 ET48 Silver" банально без движка с помощю regex. Мне нужно вытащить отсюда 7 отдельных записей 1) Valencia 2) 7 3) 17 4) 5x112 5) 70.1 6) D70.1 8) Silver. Эти данные не фиксированные т.е. вместо них могут быть другие ицифры названия но форат неизменный.
Matras вне форума Ответить с цитированием
Старый 15.08.2013, 21:07   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Не знаю с чего я взял, что следующая инфа будет полезна... Маловероятно, что вам подойдёт решение на С++.

Я немного знаком с QRegExp из библиотеки Qt. Но не представляю как предсказать изменение ваших данных с помощью регулярного выражения. Не силён в RE.

Предлагаю другое решение - сплитить через пробел. В стандартной библиотеке С++ нет функции split. split есть в Boost и Qt.

В интернете нашёл реализацию для стандартного С++. Ниже результат работы программы и весь рабочий пример.

Цитата:
item[0] = Valencia
item[1] = 7x17/5x112
item[2] = D70.1
item[3] = ET48
item[4] = Silver
main.cpp
Код:
/* 
 * File:   main.cpp
 * Author: Ivan
 *
 * Created on August 15, 2013, 8:39 PM
 */

#include <vector>
#include <sstream>
#include <iostream>

struct split {

    enum empties_t {
        empties_ok, no_empties
    };
};

std::vector <std::string> & split(
            std::vector <std::string> & result,
            const std::string& inputBuffer,
            const std::string& delimiters,
            split::empties_t empties = split::empties_ok);

std::vector <std::string> & split(
        std::vector <std::string> & result,
        const std::string& s,
        const std::string& delimiters,
        split::empties_t empties) {
    result.clear();
    size_t current;
    size_t next = -1;
    do {
        if (empties == split::no_empties) {
            next = s.find_first_not_of(delimiters, next + 1);
            if (next == std::string::npos) break;
            next -= 1;
        }
        current = next + 1;
        next = s.find_first_of(delimiters, current);
        result.push_back(s.substr(current, next - current));
    } while (next != std::string::npos);
    return result;
}

int main(int argc, char** argv) {
    
    std::string inputData = "Valencia 7x17/5x112 D70.1 ET48 Silver";
    
    std::vector<std::string> listOfData;
    
    split(listOfData, inputData, " ");
    
    for (int i = 0; i < listOfData.size(); i++) {
        std::cout << "item[" << i << "] = " << listOfData[i] << std::endl;
    }

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 15.08.2013, 22:01   #3
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Код:
/([\w]+) ([\d])x([\d]+)\/([\d]x[\d]+) ([A-Z]([\d.]+)) .+ ([\w]+)/
Код:
//javascript code:
"Valencia 7x17/5x112 D70.1 ET48 Silver".match(/([\w]+) ([\d])x([\d]+)\/([\d]x[\d]+) ([A-Z]([\d.]+)) .+ ([\w]+)/);

console:
["Valencia 7x17/5x112 D70.1 ET48 Silver", "Valencia", "7", "17", "5x112", "D70.1", "70.1", "Silver"]
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 16.08.2013, 09:14   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Почитал немного о регулярных выражениях. Оказывается, это очень полезная штука. Только сложная очень. Туториалов полно, но...

Может дадите ссылку на книжку хорошую и\или туториалы (только без загонов и сложностей)

На Qt C++ сделал:



Код:
#include <QCoreApplication>
#include <QRegExp>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // ([\w]+) ([\d])x([\d]+)\/([\d]x[\d]+) ([A-Z]([\d.]+)) .+ ([\w]+)
    // Valencia 7x17/5x112 D70.1 ET48 Silver

    QRegExp reCap("^([\\w]+) ([\\d])x([\\d]+)/([\\d]x[\\d]+) ([A-Z]([\\d.]+)) .+ ([\\w]+)$");
    reCap.indexIn("Valencia 7x17/5x112 D70.1 ET48 Silver");
    qDebug() << reCap.cap(0);
    qDebug() << reCap.cap(1);
    qDebug() << reCap.cap(2);
    qDebug() << reCap.cap(3);
    qDebug() << reCap.cap(4);
    qDebug() << reCap.cap(5);
    qDebug() << reCap.cap(6);
    qDebug() << reCap.cap(7);

    return a.exec();
}

Последний раз редактировалось 8Observer8; 16.08.2013 в 09:23.
8Observer8 вне форума Ответить с цитированием
Старый 20.08.2013, 10:44   #5
Matras
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 32
По умолчанию

Мне нужен был просто Regex который можно выполнить в Notepad++ без языков. В итоге вот таким воспользовался
Код:
^.*?([\d.]+\s*(x|х)\s*[\d.]+\s*\/.*ET-?\d+).*$
replace $1
Теперь буду признателен если кто не будь поможет вот с такой задачкой на regex. Нужно для следующих записей, удалить все что находится после ET c цифрами, на примере, я ,после знака равно показал то какие данные я ожидаю получить :
Код:
Ягуар 5.5x14/4x100 D67.1 ET38 Белый алмаз = Белый алмаз
Юнона 6.5x15/5x139.7 ET40 = 
Тортуга 7x17/5x114.3 D67.1 ET45 Айс = Айс
Тортуга 7x17/5x114.3 D67.1 ET45 Блэк Джек = Блэк Джек
Спринт 6.5x15/5x100 D67.1 ET43 блэк платинум = блэк платинум 
да Винчи 7.5x17/5x130 D84.1 ET35 Алмаз блэк-аурум = Алмаз блэк-аурум
Антей 5.5x14/4x100 D67.1 ET45 сильвер = сильвер
Zenith 8x17/5x108 D72 ET35 HS = HS 
Zenith 8x17/5x112 D76 ET30 Matt Black = Matt Black
YQ8 6.5x15/4x108 D65.1 ET27 GMMF = GMMF
Y-9100 7.5x17/5x114.3 D60.1 ET45 Silver = Silver
X-113 7x17/5x112 D66.6 ET45 HSB/FP = HSB/FP 
X10 7.5x17/5x112 D72.5 ET35 Black Pol. = Black Pol.
Warrior 8x18/5x120 D72.6 ET53 GMMFML = GMMFML
Vittoria 8x18/5x120 D79 ET45 Matt Graphite = Matt Graphite
Matras вне форума Ответить с цитированием
Старый 20.08.2013, 13:48   #6
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

1. Ctrl+H
2. Отметить чекбокс "Регулярное выражение"
3. Найти:
Код:
.+ ET[\d]+
4. Заменить: [пусто]
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 21.08.2013, 01:25   #7
Matras
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 32
По умолчанию

Спасибо все работает.
Matras вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Regex record222 PHP 2 20.01.2013 14:43
C# и regex Vigo_Alex Помощь студентам 0 12.10.2010 02:26
Java, regex Namolem Помощь студентам 0 02.05.2010 23:07
Regex Cpluser Общие вопросы .NET 1 27.04.2010 14:52
Regex CWD Общие вопросы .NET 6 14.11.2009 23:42