⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。
如果觉得本文能帮到您,麻烦点个赞
👍呗!近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
实现模糊查询
- 0、知识点:
- 1、 确定需求
- 2、 定位需要修改的位置
- 3、 正则化表达式的书写
- 功能实现
0、知识点:
- 正则化表达式的书写
- 正则化表达式的应用
- 模糊匹配中按照顺序进行匹配
- 模糊匹配中遇到空格的处理
- 模糊匹配算法的优化
- 如何提高模糊查询的效率(QtConcurrent)
1、 确定需求
要实现模糊查询,您可以使用正则化表达式来匹配文件名。正则表达式可以匹配类似于通配符的模式,并可以通过捕获组提取有用的信息。
这个功能真是饶了太久了,一开始没弄清楚需求。
先说一下需求是这样的:
支持模糊匹配搜索,例如输入“wps”,能够搜到 “wps.exe”也能搜到 “windows powsershell.exe";
需要定位到需要修改的函数。
2、 定位需要修改的位置
on_findButton_clicked()
这个槽函数中出发了查找按钮,在其中里面查找对应的函数。
// 文件名进行查找文件
findRecursion(path, fileName.isEmpty() ? QStringLiteral("*") : fileName, &files);
qDebug()<<"files Name"<<fileName<<"files"<<files<<endl;
// 在已经查找出的文件进一步查找哪些包含了text
3、 正则化表达式的书写
QString filePattern = fileName.split("").join("\\S*\\s*");
对findRecursion()
函数进行修改。
void findRecursion(const QString& path, const QString& fileName, QStringList* result)
{
QDir currentDir(path);
const QString prefix = path + QLatin1Char('/');
// 如果输入的文件名是 * ,则列出所有文件
if (fileName == "*")
{
foreach (const QString& match, currentDir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot))
{
QString filePath = prefix + match;
result->append(filePath);
}
}
else
{
foreach (const QString& match, currentDir.entryList(QDir::Files | QDir::NoSymLinks))
{
QString filePath = prefix + match;
// 将文件名拆分为字符,用\S*拼接后作为正则表达式匹配模式
QString filePattern = fileName.split("").join("\\S*\\s*");
QRegularExpression regex(filePattern, QRegularExpression::CaseInsensitiveOption);
if (regex.match(match).hasMatch())
{
result->append(filePath);
}
}
foreach (const QString& dir, currentDir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot))
{
findRecursion(prefix + dir, fileName, result);
}
}
}
需要注意的地方是:
- 当文件名为
*
的时候,不需要进行额外的处理。- 如果是文件名需要将其进行拆分以进行模糊查询,支持windows 可以通过wds查询到。想要实现在输入"wps"的情况下,能够搜索到包含"w", “p”, "s"三个字符且按照"wps"的顺序排列的文件名,可以对输入的文件名进行拆分,拆分成每个字符,然后将每个字符用\S*连接起来作为正则表达式的模式进行匹配。
- 最特别的一点是:windows powsershell.exe 这里有个空格,需要进行因此对空格进行处理。
\\S*\\s*
功能实现
输入*
查询一下 文件目录下的所有文件:
输入WPS
进行模糊查询:
不过 需要注意的是微信
这个中文的关键词 我们只做首字母匹配。
最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力