正则表达式C++如何搜索有效的 Linux 设备节点



给定Linux中的设备节点,例如"/dev/sda1"或"/dev/sdb",我想匹配所有有效选项以了解我是否有有效的设备节点。

这是我到目前为止所拥有的:

static bool isUSBNameValid(const std::string &node) {
    std::regex device("/dev/sd[a-z]*");
    if (std::regex_match(node, device)) {
            return true;
    }   
    return false;
}

这行不通。这是为什么呢?

如何使其与任何有效的 Linux 设备节点一起工作?

您的/dev/sd[a-z]*模式匹配/dev/sd文字子字符串后跟任何 0+ 小写 ASCII 字母。在regex_match中使用,模式必须匹配整个字符串。由于/dev/sda1以数字结尾,因此regex_match失败,但/dev/sdb成功。

因此,如果您打算只匹配SATA设备,则需要使用/dev/sd[a-z][0-9]*模式,否则,在/dev/之后匹配任意数量的字母数字字符,您可以使用/dev/[[:alnum:]]+

std::regex device_sata("/dev/sd[a-z][0-9]*");
std::regex device_any("/dev/[[:alnum:]]+");

请参阅C++演示:

#include<regex>
#include <iostream>
using namespace std;
bool isUSBNameValid(const std::string &node, std::regex device) {
    if (std::regex_match(node, device)) {
            return true;
    }
    return false;
}
int main() {
    std::regex device_sata("/dev/sd[a-z][0-9]*");
    std::regex device_any("/dev/[[:alnum:]]+");
    cout<< ( isUSBNameValid("/dev/sda1", device_sata) ? "Found" : "Not found")<<endl;
    cout<< ( isUSBNameValid("/dev/sdb", device_sata) ? "Found" : "Not found")<<endl;
    cout<< ( isUSBNameValid("/dev/ttyS0", device_any) ? "Found" : "Not found")<<endl;
    return 0;
}

我建议采用以下模式:

std::regex device("/dev/sd[a-z][0-9]*");

[a-z] 和 [0-9]* 周围添加捕获组(如果这变得很重要(。

如果您真的想匹配任何设备,那将是:

std::regex device("/dev/[[::anum]]+");

并额外检查您匹配的内容不是目录。无论如何,添加这样的检查(使用统计数据(可能会很好。

相关内容

最新更新