2015-11-12 4 views
3

Я надеялся, что QString позволит это:В Qt, что берет наименьшее количество кода для замены совпадений строк с регулярными выражениями?

QString myString("School is LameCoolLame and LameRadLame"); 
myString.replace(QRegularExpression("Lame(.+?)Lame"),"\1"); 

Оставляя

"School is Cool and Rad" 

Вместо от того, что я видел в документации, делая это намного более запутанным требуя, чтобы сделать (из документации):

QRegularExpression re("\\d\\d \\w+"); 
QRegularExpressionMatch match = re.match("abc123 def"); 
if (match.hasMatch()) { 
    QString matched = match.captured(0); // matched == "23 def" 
    // ... 
} 

Или в моем случае что-то вроде этого:

QString myString("School is LameCoolLame and LameRadLame"); 
QRegularExpression re("Lame(.+?)Lame"); 
QRegularExpressionMatch match = re.match(myString); 
if (match.hasMatch()) { 
    for (int i = 0; i < myString.count(re); i++) { 
     QString newString(match.captured(i)); 
     myString.replace(myString.indexOf(re),re.pattern().size, match.captured(i)); 
    } 
} 

И это даже не работает, (фактически я сдался). Должен быть более удобный способ. Для простоты и удобочитаемости кода я хотел бы знать методы, которые занимают наименьшие строки кода для этого.

Спасибо.

+1

Существует ['QString :: replace (const QRegularExpression & re, const QString & after)'] (http://doc.qt.io/qt-5/qstring.html#replace-12). – thuga

+0

Вам просто нужно заменить 'Lame' пустой строкой. Другая проблема заключается в том, что в Qt нет '. +?' Lazy quantifier, вам нужно использовать 're.setMinimal (true)'. Попробуйте 'QString myString (« School is LameCoolLame и LameRadLame »); QRegularExpression re ("Lame (. +) Lame"); re.setMinimal (истина); myString = myString.replace (re, "\\ 1"); '. –

+0

Похоже, вы даже отказались от получения помощи здесь. –

ответ

5
QString myString("School is LameCoolLame and LameRadLame"); 
myString.replace(QRegularExpression("Lame(.+?)Lame"),"\\1"); 

Выше кода работает так, как вы ожидали. В вашей версии вы забыли избежать escape-символа.