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