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;
}
给定 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;
}