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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите состряпать несколько регекспов.  (Прочитано 6811 раз)
niXman
Гость
« : Март 29, 2010, 18:38 »

уже много лет не могу выучить регекспы. хз, дебил наверное Смеющийся

перечислю, может кто поможет.
для QRegExp.

1. пространство имен "ONE" переименовать в "two"
возможные варианты:
namespace ONE {
ONE::
::ONE::

2. форма именования функций/методов
из "someFunctionName" в "some_function_name"

3. инклуды
из "<ONE/someFileName.hpp>" в "<two/some_file_name.hpp>"

пример кода:
Код
C++ (Qt)
 
#include <ONE/someFileName.hpp> // <two/some_file_name.hpp>
#include "ONE/someFileName.hpp" // "two/some_file_name.hpp"
#include <any/ONE/someFileName.hpp> // <any/two/some_file_name.hpp>
#include <anyONE/someFileName.hpp> // <anyONE/some_file_name.hpp>
 
namespace ONE { // two
someFunctionName(); // some_function_name();
}
 
namespace any { // any
using namespace ONE; // two
someFunctionName(); // some_function_name();
}
 
namespace ONE1 { // ONE1
namespace any2 { // any2
::ONE::someFunctionName(); // ::two::some_function_name();
}
}
 
namespace ONEone { // ONEone
namespace any2 { // any2
::ONE::someFunctionName(); // ::two::some_function_name();
}
}
 
int main() {
ONE::someFunctionName(); // two::some_function_name();
}
 

благодарен всем откликнувшимся.
« Последнее редактирование: Март 29, 2010, 21:06 от niXman » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Март 29, 2010, 19:31 »

1.
Код:
QString str = "namespace ONE";
QRegExp regExp("(\\D{3}$)");
str.replace(regExp, "two");
На выходе "namespace two". Если правильно понял конечно...
Записан

kubuntu/Win7/x64/NetBeans
niXman
Гость
« Ответ #2 : Март 29, 2010, 19:39 »

serg_hd, спасибо. сейчас протещу.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Март 29, 2010, 19:47 »

niXman: про тёщу???
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
SimpleSunny
Гость
« Ответ #4 : Март 29, 2010, 19:47 »

Для всех представленных трех случаев "ONE, two, someFunctionName" заданы или должны автоматически искаться в тексте?
Записан
niXman
Гость
« Ответ #5 : Март 29, 2010, 20:04 »

Пантер, - "протестирую"

SimpleSunny, не понял вопроса..
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Март 29, 2010, 20:07 »

3.
Код:
 QString str = "<ONE/someFileName.hpp>";
 QList<QString> list;
 list.append("A");
 list.append("B");
 list.append("C");
 list.append("D");
 list.append("E");
 list.append("F");
 //...
 list.append("N");
 //...

 QRegExp regExp("(<\\D{3})");
 str.replace(regExp, "<two");

 for (int i = 0; i < list.size(); i ++)
 {
  QRegExp regExp2("(" + list[i] + ")");
  str.replace(regExp2, "_"+list[i].toLower());
 }
 
 qDebug() << str;
на выходе "<two/some_file_name.hpp>". Согласен - костыльно, но работает)). Наверное лучше чем ничего...
Записан

kubuntu/Win7/x64/NetBeans
niXman
Гость
« Ответ #7 : Март 29, 2010, 20:10 »

serg_hd, прикольно. я пробовал исключительно регекспами это реализовать. как-то даже не приходило в голову замутить столь необычный регексп.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #8 : Март 29, 2010, 20:12 »

serg_hd, прикольно. я пробовал исключительно регекспами это реализовать. как-то даже не приходило в голову замутить столь необычный регексп.
я тоже думал сначала, но именно в QRegExp ничего подходящего вроде не нашёл.
Записан

kubuntu/Win7/x64/NetBeans
Akaiten
Гость
« Ответ #9 : Март 30, 2010, 08:50 »

2. Искать "\\b[a-z]+([A-Z]+[a-z]+)+\\b" (можно добавить другие символы, если встречаются в именах, например "_"), а затем в найденной строке заменить все найденные "([A-Z]+[a-z]+)" на "_\1".
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #10 : Март 30, 2010, 09:02 »

я вот такой примерчек накидал
Код:
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QRegExp>
#include <QDebug>

QString Low(QString s)
{
    QList<int> listIn;

    int index = 0;

    for (int i = 1;i < s.count();i++)
    {
        if (s[i].isUpper())
        {
            listIn << i + index;
            index++;
        }
    }

    s = s.toLower();

    for (int i = 0; i < listIn.count();i++)
    {
        s.insert(listIn[i],"_");
    }

    return s;
}

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

    QFile file("in");
    file.open(QIODevice::ReadOnly | QIODevice::WriteOnly);

    QString str = file.readAll();

    QRegExp regex;
    regex.setPatternSyntax(QRegExp::RegExp);

    regex.setPattern("\\bONE/");
    str.replace(regex,"tow/");

    regex.setPattern("\\bONE::\\b");
    str.replace(regex,"tow::");

    regex.setPattern("\\bnamespace[^\\S]+ONE\\b");
    str.replace(regex,"namespace tow");

    regex.setPattern("\\b(\\S+)\\(");

    int pos = 0;

    while ((pos = regex.indexIn(str,pos)) != -1)
    {
        qDebug() << pos << regex.cap(1) << Low(regex.cap(1));
        pos += regex.matchedLength();
        str.replace(regex.cap(1),Low(regex.cap(1)));
    }

    regex.setPattern("\\b/(\\S+).hpp|\\b/(\\S+).h");

    pos = 0;

    while ((pos = regex.indexIn(str,pos)) != -1)
    {
        qDebug() << pos << regex.cap(1) << Low(regex.cap(1));
        pos += regex.matchedLength();
        str.replace(regex.cap(1),Low(regex.cap(1)));
    }

    qDebug() << str;


    file.close();
    return 0;
}


может быть несовершенен Улыбающийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #11 : Март 30, 2010, 09:27 »

вот немного поправил так получше будет
Код:
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QRegExp>
#include <QDebug>

QString Low(QString s)
{

    QList<int> listIn;

    QRegExp reg;
    reg.setPatternSyntax(QRegExp::RegExp);
    reg.setPattern("\\b::(\\S+)");
    if (reg.indexIn(s,0) != -1)
    {
        s.replace(reg.cap(1),Low(reg.cap(1)));
        return s;
    }

    int index = 0;

    for (int i = 1;i < s.count();i++)
    {
        if (s[i].isUpper())
        {
            listIn << i + index;
            index++;
        }
    }

    s = s.toLower();

    for (int i = 0; i < listIn.count();i++)
    {
        s.insert(listIn[i],"_");
    }

    return s;
}

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


    QFile file("in");
    file.open(QIODevice::ReadOnly | QIODevice::WriteOnly);

    QString str = file.readAll();

    QRegExp regex;
    regex.setPatternSyntax(QRegExp::RegExp);

    regex.setPattern("\\bONE/");
    str.replace(regex,"tow/");

    regex.setPattern("\\bONE::\\b");
    str.replace(regex,"tow::");

    regex.setPattern("\\bnamespace[^\\S]+ONE\\b");
    str.replace(regex,"namespace tow");


    regex.setPattern("\\b(\\S+)\\(");

    int pos = 0;

    while ((pos = regex.indexIn(str,pos)) != -1)
    {
        qDebug() << pos << regex.cap(1) << Low(regex.cap(1));
        pos += regex.matchedLength();
        str.replace(regex.cap(1),Low(regex.cap(1)));
    }

    regex.setPattern("\\b/(\\S+).hpp|\\b/(\\S+).h");

    pos = 0;

    while ((pos = regex.indexIn(str,pos)) != -1)
    {
        qDebug() << pos << regex.cap(1) << Low(regex.cap(1));
        pos += regex.matchedLength();
        str.replace(regex.cap(1),Low(regex.cap(1)));
    }

    qDebug() << str;


    file.close();
    return 0;
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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