son*_*van 4 c++ qstring qt qregexp
我有一个字符串。例如:
QString myString = "Today is Tuesday";
Run Code Online (Sandbox Code Playgroud)
要求是:当用户键入一个字符串时,如果该字符串包含在 中myString,则该部分myString应为粗体,不区分大小写(Qt::CaseInsensitive),但myString应保留的格式(大写字符应为大写和小写字符)应该是小写)。
例如:
tu- >今天是屠esdayES- >今天是屠ES天aY- >托德AY就是Tuesd AY这是我的功能:
void myClass::setBoldForMatching( const QString &p_text )
{
QRegExp regExp( p_text, Qt::CaseInsensitive, QRegExp::RegExp );
if ( !p_text.isEmpty() )
{
if ( myString.contains( regExp ) )
{
myString = myString.replace( p_text, QString( "<b>" + p_text + "</b>" ), Qt::CaseInsensitive );
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个函数是错误的,因为
用户类型t- >吨ODAY就是吨uesday。
我需要的是牛逼ODAY就是牛逼uesday
我应该如何更新我的函数?
我们可以使用一个不同的QString::replace(),它接受一个QRexExp,来替换所有的出现。关键是我们需要一个捕获组,以便使用反向引用 ( \1)替换替换中的原始文本:
#include <QRegExp>
QString setBoldForMatching(QString haystack, const QString& needle)
{
if (needle.isEmpty()) return haystack;
const QRegExp re{"("+QRegExp::escape(needle)+")", Qt::CaseInsensitive};
return haystack.replace(re, "<b>\\1</b>");
}
Run Code Online (Sandbox Code Playgroud)
#include <QDebug>
int main()
{
qInfo() << setBoldForMatching("THIS DAY (today) is Tuesday.", "Day");
}
Run Code Online (Sandbox Code Playgroud)
THIS DAY(以天)是周二一天。