C++ std :: regex正则表达式查找多个匹配项

Kyl*_*ksa 9 c++ regex

我试图用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);
Run Code Online (Sandbox Code Playgroud)

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

Tha*_*wen 7

看起来你只是试图得到一个看起来像OU=XXXXXXXXXXXXXXXXX逗号或分号后面的字符串.

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

OU=[^,;]+
Run Code Online (Sandbox Code Playgroud)

这意味着字符串OU=,后跟至少一个不是逗号或分号的字符:

[^,;]+  
Run Code Online (Sandbox Code Playgroud)

这是使用此正则表达式打印匹配项的代码示例(基于此处的示例):

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;
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*rry 5

尝试改用否定的字符类。我感到您的角色班级表现不像您认为的那样...

subjectRx("OU=[^,]*", std::regex_constants::icase);
Run Code Online (Sandbox Code Playgroud)

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

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

while (std::regex_search (mySubject,OuMatches,subjectRx)) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

我对C ++不太了解,但我发现此文档页面应该更有用。

它在这里的代码是

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

编辑:我只是意识到您可以在in中使用逗号,而in O=则无法使用[^,]。相反,您可以使用此正则表达式:

OU=(?:[^,]|,(?!(?:[^"]*"[^"]*"[^"]*)*$))*
Run Code Online (Sandbox Code Playgroud)

您可以O= 在此处查看示例。