c++ - 如何替换字符串中的 QRegExp?

标签 c++ qt qstring qregexp

我有一个字符串。例如:

QString myString = "Today is Tuesday";

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

例如:

  • 用户类型:tu -> 今天是Tuesday
  • 用户类型:ES -> 今天是周二esday
  • 用户类型:aY -> Today is Tuesday

这是我的功能:

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 );
    }
  }
}

这个函数是错误的,因为

用户类型t -> t今天是t星期二。

我需要的是T今天是T星期二

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

最佳答案

我们可以使用一个不同的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>");
}

演示

#include <QDebug>
int main()
{
    qInfo() << setBoldForMatching("THIS DAY (today) is Tuesday.", "Day");
}

THIS DAY (today) is Tuesday.

关于c++ - 如何替换字符串中的 QRegExp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52054261/

相关文章:

c++ - 读取字节后丢失指针

c++ - 为 C++ 设置 Qt 的初学者指南

c++ - 从 QList 中删除重复项

c++ - Qt C++ QString 到 QByteArray 的转换

c++ - 为什么我通过C++中的空指针调用成员函数时程序不会崩溃?

c++ - 如何按不同 std::vector 的值对 std::vector 进行排序?

c++ - 变量 'uChar' 周围的堆栈已损坏

c++ - 如果为空,则从 QListWidget 中删除可编辑项

c++ - QString 和德语变音符号

c++ - 在 Tab 空间拆分 QString