给定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]]+");
并额外检查您匹配的内容不是目录。无论如何,添加这样的检查(使用统计数据(可能会很好。