Oli
Oli

Reputation: 1393

Qt Regular expression to split string between [ ]

I want to split a string [A ] [B 1] [C 2] [D 254] [E 0]

into [A ], [B 1], [C 2], [D 254] and [E 0].

I have tested the expression \[(.*?)\] online which is working fine, but I am not able to split it using QRegExp. The code is given below.

    QRegExp rx("\[(.*?)\]"); //RegEx for [----]
    QString str("[A ] [B 1] [C 2] [D 254] [E 0] ");
    QStringList query = str.split(rx);
    for( auto q : query ) {
        qDebug() << q;
    }

Can anybody point out where I am making the mistake. Thank you.

Upvotes: 3

Views: 3013

Answers (2)

Anon
Anon

Reputation: 2492

What you need to split this string properly are "lookaheads" and "lookbehinds".

QString s("[A ] [B 1] [C 2] [D 254] [E 0]");
QStringList sl = s.split(QRegularExpression("(?<=\\])[ ](?=\\[)"));

Tossing that into a qDebug() << sl; gave me this:

enter image description here

Lets break it down:

  • (?<=\\]) or (?<=PutTextHere)is a "positive lookbehind", which will see if the string behind it matches, but not include it in the match itself.
  • [ ] This could just simply be an empty space: -- I just include the square brackets for readability.
  • (?=\\[) or (?=PutTextHere)is a "positive lookahead"
  • \\[ The reason why you need two escapes, is that the regular expression needs one escape \, and your code will need to escape the escape. An alternative would be:
    QStringList sl = s.split(QRegularExpression("(?<="
                           + QRegularExpression::escape("]")
                           + ")[ ](?="
                           + QRegularExpression::escape("[")
                           + ")"));

Upvotes: 2

Oli
Oli

Reputation: 1393

"\\[|\\] " can split the enclosed [ITEM].

Upvotes: 0

Related Questions