我正在尝试用c ++解析证书,并认为这是学习Regex的好机会。我刚刚在大约一个小时前了解了正则表达式,所以请原谅我缺乏知识。
我正在寻找与条目相关的所有OU。
我正在做以下事情:
std::smatch OuMatches;
std::string myCertSubject = "O=\"My Company, Incorporated\", OU=Technician Level - A3, OU=Access Level - 1, CN=\"Name, My\", E=namem@company.com";
std::regex subjectRx("OU=[[:w:]|[:s:]|[:digit:]|-]*", std::regex_constants::icase);
bool foundOU = std::regex_search(mySubject,OuMatches,subjectRx);
为什么这不能给我所有符合我的注册表的结果(2)?有没有办法得到这个?
答案 0 :(得分:6)
看起来你只是想获得一个看起来像OU=XXXXXXXXXXXXXXXXX
的字符串,然后是逗号或分号。
这个正则表达式会这样做:
OU=[^,;]+
这意味着字符串OU=
,后跟至少一个不是逗号或分号的字符:
[^,;]+
以下是使用此正则表达式打印匹配项的代码示例(基于示例here):
std::smatch OuMatches;
std::string myCertSubject = "O=\"My Company, Incorporated\", OU=Technician Level - A3, OU=Access Level - 1, CN=\"Name, My\", E=namem@company.com";
std::regex subjectRx("OU=[^,;]+", std::regex_constants::icase);
std::regex_iterator<std::string::iterator> it (myCertSubject.begin(), myCertSubject.end(), subjectRx);
std::regex_iterator<std::string::iterator> end;
while (it != end)
{
std::cout << it->str() << std::endl;
++it;
}
答案 1 :(得分:5)
尝试使用否定的字符类。我觉得你的角色课程表现得并不像你认为的那样......
subjectRx("OU=[^,]*", std::regex_constants::icase);
[^,]*
将匹配除逗号之外的所有字符。
关于比赛,请尝试使用循环:
while (std::regex_search (mySubject,OuMatches,subjectRx)) {
// do something
}
我不太了解C ++,但我发现this documentation page我认为应该更有用。
这里的代码是
while (std::regex_search (s,m,e)) {
for (auto x:m) std::cout << x << " ";
std::cout << std::endl;
s = m.suffix().str();
}
编辑:我只是意识到你可以在O=
中的参数中使用逗号,这些参数不会与[^,]
一起使用。相反,您可以使用此正则表达式:
OU=(?:[^,]|,(?!(?:[^"]*"[^"]*"[^"]*)*$))*
您可以看到O=
here的示例。