2013-07-19 4 views
2

У меня есть QString, который содержит список зарезервированных слов. Мне нужно разобрать еще одну строку, используя для любых слов, которые содержатся в первом, и добавляются к \ "\" и изменяют эти ocorrences.Использование QRegExp заменить слова, которые находятся в QString

Пример:

QString reserved = "command1,command2,command3" 

QString a = "\command1 \command2command1 \command3 command2 sometext" 

parseString(a, reserved) = "<input com="command1"></input> \command2command1 <input com="command3"></input> command2 sometext" 

Я знаю, что я должен использовать QRegExp, но я не нашел, как использовать QRegExp, чтобы проверить, является ли слово в списке, я объявил. Можете ли вы, ребята, помочь мне?

Заранее спасибо

+0

[QString :: contains] (http://qt-project.org/doc/qt-5.0/qtcore/qstring.html#contains-5) и [QRegExp] (http://qt-project.org) /doc/qt-5.0/qtcore/qregexp.html) – Huy

ответ

2

Я бы расколоть reservedWords список в QStringList затем перебирать каждое зарезервированное слово. Затем вы добавляете символ \ (его нужно экранировать в QString) и используйте функцию indexOf(), чтобы увидеть, существует ли это зарезервированное слово во входной строке.

void parseString(QString input, QString reservedWords) 
{ 
    QStringList reservedWordsList = reserved.split(','); 
    foreach(QString reservedWord, reservedWordsList) 
    { 
     reservedWord = "\\" + reservedWord; 
     int indexOfReservedWord = input.indexOf(reservedWord); 
     if(indexOfReservedWord >= 0) 
     { 
      // Found match, do processing here 
     } 
    } 
} 
+0

Обратите внимание, что вам нужно убрать \ символы. –

+0

Хороший улов. Я обновил ответ. –

+0

Работал как шарм, Кори! Большое спасибо! – Tyras

1

Если вы хотите, чтобы сделать эту работу с QRegEx, вот код:

QString reservedList("command1,command2,command3"); 

QString str = "\\command1 \\command2command1 \\command3 command2 sometext"; 

QString regString = reservedList; 
regString.prepend("(\\\\");  \\ To match the '\' character 
regString.replace(',', "|\\\\"); 
regString.append(")");   \\ The final regString: (\\\\command1|\\\\command2|\\\\command3) 
QRegExp regex(regString); 
int pos = 0; 

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

Я могу помочь вам с помощью следующего кода:

QString string1 = "a b c d e f g h i j k l m n o p q r s t u v w y z"; 
QRegExp regExp("(a|e|i|o|u|y)");//letters to be escaped with a backslash, brackets are used to capture the regular expressions in the current string 
string1.replace(regExp,"(\\1)");//Puts each letter a, e, i, o, u, y in brackets 
//string1=="(a) b c d (e) f g h (i) j k l m n (o) p q r s t (u) v w (y) z" 
string1 = "a b c d e f g h i j k l m n o p q r s t u v w y z"; 
QRegExp regExp2("a|e|i|o|u|y"); 
string1.replace(regExp2,"(\\1)");//Replace each letter a, e, i, o, u, y by the string (\1) 
//string1=="(\1) b c d (\1) f g h (\1) j k l m n (\1) p q r s t (\1) v w (\1) z" 

В вашем случае:

QString reserved = "command1,command2,command3"; 
QString copyOfReserved = reserved; 
copyOfReserved.replace(",","|"); 
//copyOfReserved == "command1|command2|command3" 
copyOfReserved = "\\b("+copyOfReserved+")\\b"); 
//copyOfReserved == "\b(command1|command2|command3)\b" 
QString a = "\\command1 \\command2command1 \\command3 command2 sometext"; 
QString b = a; 
b.replace(QRegExp("\\\\(" + copyOfReserved + ")"),"<input com=\"\\1\"></input>"); 
//b == "<input com="command1"></input> \command2command1 <input com="command3"></input> command2 sometext" 

Надеюсь, я помог вам.