Russian Qt Forum

Qt => Общие вопросы => Тема начата: woka от Апрель 12, 2012, 18:55



Название: [РЕШЕНО] Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 12, 2012, 18:55
скажу кратко о моей задаче: я свой язык разметки должен открыть в своём браузере. вообщем я преобразовываю свой файл в html и открываю его.

нужно сделать так чтобы регулярное выражение искало всё слово(слова), а не набор букв. например есть текст в стринге {work working [work] worked} и мне надо чтобы она увидев [work] заменила на <work> и не больше. помогите составить такое выражение.  

извиняюсь что поднял ещё раз эту тему, но ничего подходящего не нашёл


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: V1KT0P от Апрель 12, 2012, 19:01
скажу кратко о моей задаче: я свой язык разметки должен открыть в своём браузере. вообщем я преобразовываю свой файл в html и открываю его.

нужно сделать так чтобы регулярное выражение искало всё слово(слова), а не набор букв. например есть текст в стринге {work working [work] worked} и мне надо чтобы она увидев [work] заменила на <work> и не больше. помогите составить такое выражение. 

извиняюсь что поднял ещё раз эту тему, но ничего подходящего не нашёл
Код
C++ (Qt)
QString::replace("[work]", "<work>");
Не?


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: BuRn от Апрель 12, 2012, 21:44
Простите . а зачем тут Qt? Не проще ли распарсить с помощью скрипта bash и регулярок ?


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 12, 2012, 23:35
я делаю реализацию на qt. я под виндовс начал писать, да и знания bash не велики, только простейшие операции. да и мне надо делать всё своё.
по поводу replace идея классная и работает, но что делать если внутри тега есть какая то информация? ссылка например. а закрывающиеся теги?


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: BuRn от Апрель 13, 2012, 06:53
я делаю реализацию на qt. я под виндовс начал писать, да и знания bash не велики, только простейшие операции. да и мне надо делать всё своё.
по поводу replace идея классная и работает, но что делать если внутри тега есть какая то информация? ссылка например. а закрывающиеся теги?
регулярные выражения тебе в помощь


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: Bepec от Апрель 13, 2012, 07:05
Burn обрати внимание на раздел форума, где тема. Там есть надпись Qt ;)

Регулярки, или же метода QString.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 13, 2012, 14:04

Регулярки, или же метода QString.
так я чего здесь и пишу, чтобы вы помогли и подсказали как


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: Bepec от Апрель 13, 2012, 14:45
1) Открываешь гугль и ищешь "регулярные выражения".

2) Открываешь Assistant, смотришь класс QRegExp.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: V1KT0P от Апрель 13, 2012, 14:45

Регулярки, или же метода QString.
так я чего здесь и пишу, чтобы вы помогли и подсказали как
Вообще я так понял тебе надо тупо все квадратные кавычки заменить на треугольные. Это делается одним проходом по всему тексту.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 13, 2012, 16:58
нет. это я к примеру приводил.пример с wiki разметкой
 [[http://www.prog.org.ru/ prog]]  -  <a href="http://www.prog.org.ru/">prog</a>
если "[[" до пробела запоминает и вставляем  после "<a href="" удаляя "[[" и припивываем "">" после её всё то что после пробела да "]]"
, а после пишем "</a>"


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: alexis031182 от Апрель 13, 2012, 17:27
Код:
QString txt = "[[http://www.prog.org.ru/ prog]]";

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");
if(reg_exp.indexIn(txt) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
}

Как-то так...


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 14, 2012, 19:24
Код:
QString txt = "[[http://www.prog.org.ru/ prog]]";

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");
if(reg_exp.indexIn(txt) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
}

Как-то так...
спасибо. по твоему примеру я начал свои выражения делать. в qt есть пример regexp там можно тестировать свои выражения.
есть ещё один вопрос. например когда большой файл обрабатывается как поступить, когда мне надо на то же самое место вставить откуда и было взято выражение.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: alexis031182 от Апрель 15, 2012, 11:05
спасибо. по твоему примеру я начал свои выражения делать. в qt есть пример regexp там можно тестировать свои выражения.
есть ещё один вопрос. например когда большой файл обрабатывается как поступить, когда мне надо на то же самое место вставить откуда и было взято выражение.
QRegExp::indexIn() возвращает позицию совпадения. Для большого кол-ва однотипных проверок лучше использовать QRegExpValidator.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 15, 2012, 15:58
подскажи какими методами это можно сделать. что то в справке ничего подходящего невижу


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: kambala от Апрель 15, 2012, 16:33
записывай в другой файл, а потом заменяй им исходный. или записывай всё в память, а потом сразу сохраняй в файл.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: alexis031182 от Апрель 15, 2012, 16:38
Виноват, QRegExpValidator не для твоего случая. Спутал с другим классом.

А что касаемо замены в строке с использованием QRegExp, то там примерно такой алгоритм может быть:
Код:
QString file_data = ТЕКСТ_ДЛЯ_ПАРСИНГА;

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");

int pos = 0;
while((pos = reg_exp.indexIn(file_data, pos)) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
   file_data.replace(pos, res.length(), res);
   pos += reg_exp.matchedLength();
}
Тут плохо то, что каждый тип тега (a, img, div и т.п.) потребует нового перезапуска парсинга. Лучше как-то за один проход.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 15, 2012, 18:36
что то я совсем перестал понимать. если у нас регулярное выражение "\\'\\'\\'(.+)\\'\\'\\'", а текст '''aaa''' u '''bbb''', то на выходе мы получаем capture aaa''' u '''bbb. подскажите как сделать чтобы она заканчивался поиск при первом нахождении или что нибудь подобное. чтобы в результате было только ааа чтобы с этим можно было работать.


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: kambala от Апрель 15, 2012, 19:10
Код
C++ (Qt)
QRegExp re;
re.setMinimal(true);


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 15, 2012, 21:01
Код:
QString file_data = ТЕКСТ_ДЛЯ_ПАРСИНГА;

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");

int pos = 0;
while((pos = reg_exp.indexIn(file_data, pos)) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
   file_data.replace(pos, res.length(), res);
   pos += reg_exp.matchedLength();
}
сразу мне ваш код понравился, но позже понял что он как то не так работает. вообщем я сделал так
Код:
  QRegExp b("\\'\\'\\'(.+)\\'\\'\\'");
    b.setMinimal(true);
      while(b.indexIn(conv) != -1){
          QString bb = "<b>"+b.cap(1)+"</b>";
          QString exbb = b.cap(0);
          conv.replace(exbb, bb);         
      }
спасибо


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 15, 2012, 21:09
Виноват, QRegExpValidator не для твоего случая. Спутал с другим классом.

А что касаемо замены в строке с использованием QRegExp, то там примерно такой алгоритм может быть:
Код:
QString file_data = ТЕКСТ_ДЛЯ_ПАРСИНГА;

QRegExp reg_exp("\\[\\[(.+)\s+(.+)\\]\\]");

int pos = 0;
while((pos = reg_exp.indexIn(file_data, pos)) != -1) {
   QString res = "<a href=\"" + reg_exp.cap(1) + "\">" + reg_exp.cap(2) + "</a>";
   file_data.replace(pos, res.length(), res);
   pos += reg_exp.matchedLength();
}
Тут плохо то, что каждый тип тега (a, img, div и т.п.) потребует нового перезапуска парсинга. Лучше как-то за один проход.
у тебя как я понял выставляется позиция в цикле и при замене на этой позиции он и заменяет. как поправить код не знаю. хотя интересно


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: alexis031182 от Апрель 15, 2012, 23:02
Я не сообразил просто, что если replace делать сразу в тексте, то как бы позиция получается и не нужна, потому что первое попавшееся совпадение будет тут же заменено на новое значение, на которое reg_exp уже не сработает. Поэтому твой вариант лучше :)

Единственное, от отслеживания текущей позиции можно выиграть в скорости, т.к. reg_exp при повторном заходе не будет смотреть весь текст с самого начала. Но это уже детали конечно, и раз не работает мой вариант, то похоже где-то в нём закрался ещё один косяк :)


Название: Re: Регулярные Выражения Из Целого Слова
Отправлено: woka от Апрель 16, 2012, 14:28
спасибо всем кто помог. благодоря вам научился пользоваться регулярными выражениями. вопрос считаю в полной мере решённым.
P.S. для тех кто пытается разобраться с регулярками: в демках qt есть пример RegExp с помощью которого можно протестировать  свои и понять что можно делать и как