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

Regex in C++ how to search for valid Linux Device Node?

给定 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 设备节点一起工作?

我建议改用以下模式:

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

如果变得重要,请在 [a-z] 和 [0-9]* 周围添加捕获组。

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

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

另外检查您匹配的不是目录。无论如何添加这样的检查(使用统计)可能会很好。

您的 /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++ demo:

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