如何替换字符串中的 QRegExp?

son*_*van 4 c++ qstring qt qregexp

我有一个字符串。例如:

QString myString = "Today is Tuesday";
Run Code Online (Sandbox Code Playgroud)

要求是:当用户键入一个字符串时,如果该字符串包含在 中myString,则该部分myString应为粗体,不区分大小写(Qt::CaseInsensitive),但myString应保留的格式(大写字符应为大写和小写字符)应该是小写)。

例如:

  • 用户类型:tu- >今天是esday
  • 用户类型:ES- >今天是屠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

我应该如何更新我的函数?

Tob*_*ght 5

我们可以使用一个不同的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(以)是周二一天