Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Выборка по ключевым словам

Автор: Ponter 3.3.2010, 12:59

Всем привет, подскажите, пожалуйста, как в строке, например:
"Введите в поле код <pod>kod_value</pod> для <pod>two_kod</pod> сохранения"
Выдрать отдельно два QStringList ("Введите в поле код ", "для" "сохранения") и ("kod_value" и "two_kod") ?
Пытался сделать через регулярное выражение и split, но не получается...есть идеи какие-нибудь?

Автор: Litkevich Yuriy 3.3.2010, 13:34

Я думаю, тут в два захода надо делать.
Такую регулярку взять за основу:
<pod>.*</pod>
сделать её не жадной.
Эта регулярка будет соответствовать:
<pod>kod_value</pod>
<pod>two_kod</pod>

И её использовать в функции split. Соответственно получишь:
Введите в поле код
для
сохранения


А за второй заход выделять то, что внутри тэгов

Автор: Ponter 3.3.2010, 14:16

Цитата(Litkevich Yuriy @ 3.3.2010, 13:34) *
<pod>.*</pod>
сделать её не жадной.
Эта регулярка будет соответствовать:
<pod>kod_value</pod>
<pod>two_kod</pod>

И её использовать в функции split.

Пишу QStringList txtList = txt_text->toPlainText().split(QRegExp("<pod>*.</pod>"));
получается txtList имеет один элемент, это вся строка которая рассматривается,не выходит:(

Автор: kwisp 3.3.2010, 14:24

можно еще воспользоваться
http://www.doc.crossplatform.ru/qt/4.5.0/qregexp.html#cap
следующим образом, к примеру:

QRegExp reg("(.+)<pod>(.+)</pod>(.+)<pod>(.+)</pod>(.+)");
while((int pos = reg.indexIn(str,0))!=-1) {
strL1.append(reg.cap(1));
strL1.append(reg.cap(3));
strL1.append(reg.cap(5));
strL2.append(reg.cap(2));
strL2.append(reg.cap(4));
}

Автор: Ponter 3.3.2010, 14:24

Ошибся. Вот так написал:
QStringList txtList = txt_text->toPlainText().split(QRegExp("<var>.*</var>"));
и вывелось "Введите в поле код "и все


Автор: Ponter 3.3.2010, 14:37

kwisp, это не подходит, потому что этих <pod> может быть сколько угодно.
Можете подсказать регулярные выражения для обоих случаев для выборки простого текста и внутри тегов.
<pod>.*</pod> для первого случая не подходит


Автор: Litkevich Yuriy 3.3.2010, 15:39

Ponter
ты забыл:

Цитата(Litkevich Yuriy @ 3.3.2010, 16:34) *
сделать её не жадной.

Автор: kwisp 3.3.2010, 16:02

ясно.
я пример привел, относительно первого поста. выже не сказали что <pod> может быть сколько угодно.
вам уже http://www.doc.crossplatform.ru/qt/4.6.x/qregexp.html#setMinimal


Цитата(Гость_Ponter_* @ 3.3.2010, 14:37) *
kwisp, это не подходит, потому что этих <pod> может быть сколько угодно.

подойдёт с небольшим изменением.
описываю регулярку словами, скорее всего в коде ошибусь. всё от начала строки или "</pod>" до "<pod>" затем всё до конца строки либо "</pod>"
QRegExp reg("(^\|(</pod>))(.+)<pod>(.+)((</pod>)\|$)");
while((int pos = reg.indexIn(str,0))!=-1)  {
strL1.append(reg.cap(3));// не уверен на счет 3
strL2.append(reg.cap(4));
}

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

можно так попробовать
QRexExp reg("(<pod>)\|(</pod>)");
QStringList strL = str.split(reg);

если начало строки не <pod> то нечетные элементы списка это элементы первого списка, четные это элементы второго. :)
|| так
QRexExp reg("</?pod>");
QStringList strL = str.split(reg);

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)