9

我正在尝试用 C++ 解析证书,并认为这是学习正则表达式的好机会。我大约一个小时前才了解正则表达式,所以请原谅我缺乏知识。

我正在寻找与条目相关联的所有 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);

为什么这不能给我所有与我的 reg ex 匹配的结果 (2)?有没有办法得到这个?

4

2 回答 2

6

看起来您只是想获得一个看起来像OU=XXXXXXXXXXXXXXXXX后跟逗号或分号的字符串。

这个正则表达式会这样做:

OU=[^,;]+

这意味着 string 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=[^,;]+", 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;
}
于 2013-09-13T19:12:59.023 回答
4

尝试改用否定字符类。我觉得你的角色类的行为不像你想象的那样......

subjectRx("OU=[^,]*", std::regex_constants::icase);

[^,]*将匹配除逗号之外的所有字符。

至于匹配,请尝试使用循环:

while (std::regex_search (mySubject,OuMatches,subjectRx)) {
    // do something
}

我不太了解 C++,但我发现这个文档页面我认为应该更有用一些。

它在这里的一段代码是

while (std::regex_search (s,m,e)) {
    for (auto x:m) std::cout << x << " ";
    std::cout << std::endl;
    s = m.suffix().str();
}

编辑:我只是意识到你可以在像 in 这样的参数中使用逗号O=,这不会与[^,]. 相反,您可以使用此正则表达式:

OU=(?:[^,]|,(?!(?:[^"]*"[^"]*"[^"]*)*$))*

O= 你可以在这里看到一个例子。

于 2013-09-13T19:04:16.110 回答