0

我有一个 C++ 代码,它在目录 /dev/ 中搜索包含单词“disk”的每个目录(在 Mac 上是我),这是所有 USB 驱动器所在的位置,但是当我这样做QRegExp("disk*")时找不到任何东西,但是当我在终端中“挂载”时,我可以找到名为 disk1s5 的 USB。为什么我用 QRegExp 找不到它?

#ifdef __APPLE__
DIR *dir = NULL;
dirent *search = NULL;
dir = opendir("/dev/");
if (dir != NULL)
{
    while ((search = readdir(dir)) != NULL)
    {
        QRegExp exp("disk*");
        exp.setPatternSyntax(QRegExp::Wildcard);
        exp.setCaseSensitivity(Qt::CaseInsensitive);
        if (exp.exactMatch(search->d_name))
        {
            return 0;
        } else {
            return 2;
        }

    }
} else {
    return 1;
}

万一

4

2 回答 2

3

您似乎混淆了通配符(shell 等中使用的通配符)和正则表达式。但它们并不相同。

在正则表达式中,*表示前面的项目出现零次或多次。因此,disk*匹配字符串disdiskdiskkdiskkk

如果您想检查disk后面的任何内容(包括什么都没有),您必须使用disk.*where.表示任何字符,因此.*表示任何出现零次或多次的字符。这完全对应于 globbing 模式disk*

根据您的需要,您还可以使用disk.+to 匹配出现一次或多次disk任何字符(与 相比disk.*,不匹配字符串disk本身)。

我强烈建议您阅读文档以了解正则表达式的真正工作原理。

于 2013-07-07T11:34:53.967 回答
0

如果您只想从中找到所有disk*目录/dev并且您正在使用 Qt,您可以这样做:

QDir dir("/dev");
QStringList nameFilter = QStringList() << "disk*";
QStringList disks = dir.entryList(nameFilter, QDir::System|QDir::Dirs);

foreach (QString d, disks)
    qDebug() << d;
于 2013-07-08T08:21:28.900 回答