Я пытаюсь проанализировать эти строки, используя регулярное выражение, но я думаю, что мое выражение регулярного выражения неверно.
Мне дана строка, и всякий раз, когда она имеет новую строку и возврат каретки, они должны быть разделены на две строки. Строки имеют следующий формат
[CharSize][Inverted][Aligned]Data
Например, если мне даны такие данные
QString s1 = "[6][1][0]Data1\n\r[5][0][1]Data2";
Когда я разделю их, будет две QString, и я возьму данные внутри открытых и закрытых скобок.
Другие действительные данные выглядят так:
QString s2 = "[7][0][1]Data3"
Неверные данные выглядят так:
QString s3 = "abc[8][1][1]Data4"
Я применил следующий QRegExp ниже:
QRegExp clrf("\n\r|\r\n|\n");
QStringList sp = str.split(clrf);
QRegexp clrf отлично работает для разделения данных с новой строкой и возвратом каретки, в обратном порядке или просто с новой строкой. Примечание: s1, s2 и s3 здесь обрабатываются нормально.
Проблема здесь:
QRegExp value("[^a-z]?\\[([0-9a-z]+)\\]\\[([0-9a-z]+)\\]\\[([0-9a-z]+)\\]([A-Za-z0-9\\'\\ \"]*)");
Когда я использую приведенный выше код, все s1, s2 и s3 обрабатываются. S3 НЕ ДОЛЖЕН обрабатываться, поскольку его первый символ не является открывающей скобкой. Можете ли вы помочь мне исправить мой QRegExp?
Спасибо.
РЕДАКТИРОВАТЬ: Весь код:
void parseString(QString str)
{
QRegExp clrf("\n\r|\r\n|\n");
QRegExp value("\\[([0-9a-z]+)\\]\\[([0-9a-z]+)\\]\\[([0-9a-z]+)\\]([A-Za-z0-9\\'\\ \"]*)");
// QRegExp value("^\[(\\d+)\]\[(\\d+)\]\[(\\d+)\](.*)$");
int p = 0, i = 0;
int res;
int cs = 0, inv = 0, al = 0;
QStringList sp = str.split(clrf);
XLineString ls;
for (i = 0; i < sp.size(); ++i) {
res = value.indexIn(sp[i], p);
while (res != -1) {
printf("Text=[%s]\n", value.cap(EData).toStdString().c_str());
printf("Digit cs[%d] ", value.cap(ECharSize).toInt());
printf("inv[%d] ", value.cap(EInvert).toInt());
printf("al[%d]\n", value.cap(EAlignment).toInt());
cs = value.cap(ECharSize).toInt();
if (value.cap(EInvert).toInt())
inv = 1;
else
inv = 0;
if (value.cap(EAlignment).toInt())
al = 1;
else
al = 0;
ls.addLine(value.cap(EData).toStdString().c_str(), cs, inv, al);
p += value.matchedLength();
res = value.indexIn(str, p);
}
}
}
int main()
{
QString str1[] = {
"[12][0][0]DATA1\n\r[78][0][1]DATA2",
"abc[1][1][1]THIS SHOULD NOT PASS",
};
for (int i = 0; i < sizeof(str1) / sizeof(str1[0]); ++i)
parseString(str1[i]);
}
'^\\[(\\d+)\\]\\[(\\d+)\\]\\[(\\d+)\\](.*)$'
- person u8sand   schedule 16.11.2015[^a-z]?
, который предположительно должен игнорировать любые строки, содержащие символы, начинающиеся с не открытой скобки. Вы имеете в виду это?^\\[([0-9a-z]+)\\]....
Я попробовал этот, но s3 все еще ловится. Мне действительно жаль. Я не силен в регулярном выражении. Можете ли вы объяснить предложенное вами выражение в последней части? - person Gibs   schedule 16.11.2015QRegExp value("^\\[(\\d+)\\]\\[(\\d+)\\]\\[(\\d+)\\](.*)$");
, и все еще ловится s3 :( - person Gibs   schedule 16.11.2015