2015-08-14 2 views
1

Используя это регулярное выражение B([^.]*)E Я пытаюсь получить все символы между B и E отQString список Раскол возврата пустых строк

B23432|234|24EB23432|2834|234EB23432|2134|234E 

Использование Qt4.8

QRegExp rx("B([^.]*)E"); 
rx.setMinimal(true); 
QString str = "B23432|234|24EB23432|2834|234EB23432|2134|234E"; 
QStringList list; 
list = str.split(rx); 
qDebug() << list; 

печатает список пустые строки. Разве он не должен возвращать все строки между B и E?

+2

Попробуйте 'B ([^ E] *) E'. –

+0

Вы пытаетесь получить все символы между B и первым E или E в самом конце линии? – d0nut

+0

'[^.]' Не будет соответствовать символу. Вы можете попробовать, что предложил @стрибижев, или 'B (. *) E'. –

ответ

1

Основная проблема заключается в том, что вы пытаетесь разбить, но на самом деле вам нужно найти все совпадения в цикле и получить capturedTexts()[1] s (или cap(1) s).

QRegExp rx("B([^E]*)E"); 
rx.setMinimal(true); 
QString str = "B23432|234|24EB23432|2834|234EB23432|2134|234E"; 
QStringList list; 
int pos = 0; 

while ((pos = rx.indexIn(str, pos)) != -1) { 
    list << rx.cap(1); 
    pos += rx.matchedLength(); 
} 
qDebug() << list; 
+0

Просто запоздалая мысль: возможно, вы могли бы использовать [split with 'B | E' regex] (https: // regex101.com/r/mT2sW5/1), но в результирующем массиве у вас будут пустые элементы. –

1

Это также работает. Если что-то не так с этим, пожалуйста, дайте мне знать.

QRegExp rx("[B(.*)E]"); 
rx.setMinimal(true); 
QString str = "B23432|234|24EB23432|2834|234EB23432|2134|234E"; 
QStringList list; 
list = str.split(rx, QString::SkipEmptyParts); 
qDebug() << list; 
+0

Это тоже работает. Интересно, какой из них более эффективен? – Vlad

+1

@ Vlad Я думал, что буду использовать это как возможность научиться использовать QBENCHMARK', и вот какие результаты. test1 - метод stribizhev: '' 'RESULT: TestBenchmark :: test1(): 0,0089 msecs за итерацию (всего: 73, итераций: 8192)' '' '' 'РЕЗУЛЬТАТ: TestBenchmark :: test2(): 0.035 msecs за итерацию (всего: 73, итераций: 2048) '' ' –