Russian Qt Forum

Программирование => Общий => Тема начата: niXman от Март 29, 2010, 18:38



Название: Помогите состряпать несколько регекспов.
Отправлено: niXman от Март 29, 2010, 18:38
уже много лет не могу выучить регекспы. хз, дебил наверное ;D

перечислю, может кто поможет.
для 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();
}
 

благодарен всем откликнувшимся.


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: serg_hd от Март 29, 2010, 19:31
1.
Код:
QString str = "namespace ONE";
QRegExp regExp("(\\D{3}$)");
str.replace(regExp, "two");
На выходе "namespace two". Если правильно понял конечно...


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: niXman от Март 29, 2010, 19:39
serg_hd, спасибо. сейчас протещу.


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: Пантер от Март 29, 2010, 19:47
niXman: про тёщу???


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: SimpleSunny от Март 29, 2010, 19:47
Для всех представленных трех случаев "ONE, two, someFunctionName" заданы или должны автоматически искаться в тексте?


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: niXman от Март 29, 2010, 20:04
Пантер, - "протестирую"

SimpleSunny, не понял вопроса..


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: serg_hd от Март 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>". Согласен - костыльно, но работает)). Наверное лучше чем ничего...


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: niXman от Март 29, 2010, 20:10
serg_hd, прикольно. я пробовал исключительно регекспами это реализовать. как-то даже не приходило в голову замутить столь необычный регексп.


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: serg_hd от Март 29, 2010, 20:12
serg_hd, прикольно. я пробовал исключительно регекспами это реализовать. как-то даже не приходило в голову замутить столь необычный регексп.
я тоже думал сначала, но именно в QRegExp ничего подходящего вроде не нашёл.


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: Akaiten от Март 30, 2010, 08:50
2. Искать "\\b[a-z]+([A-Z]+[a-z]+)+\\b" (можно добавить другие символы, если встречаются в именах, например "_"), а затем в найденной строке заменить все найденные "([A-Z]+[a-z]+)" на "_\1".


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: ecspertiza от Март 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;
}


может быть несовершенен :)


Название: Re: Помогите состряпать несколько регекспов.
Отправлено: ecspertiza от Март 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;
}