C++中的正则表达式语句没有按预期工作

Jel*_*ani 4 c++ regex

以下正则表达式语句在使用perl时匹配,但在使用c ++时不匹配.在cplusplus.com上阅读"std :: regex"类信息后,我可能不得不使用regex_search.除非,我使用regex_match中的标志.使用regex_search似乎使我想要执行的简单匹配变得复杂.我希望在1行上的匹配类似于perl.还有另一种在c ++中执行正则表达式匹配的方法吗?

C++

std::string line1 = "interface GigabitEthernet0/0/0/3.50 l2transport";
if (std::regex_match(line1, std::regex("/^(?=.*\binterface\b)(?=.*\bl2transport\b)(?!.*\.100)(?!.*\.200)(?!.*\.300)(?!.*\.400).*$/")))
cout << line1;
Run Code Online (Sandbox Code Playgroud)

perl的

my $line1 = "interface GigabitEthernet0/0/0/3.50 l2transport";
if ($line1 =~ /^(?=.*\binterface\b)(?=.*\bl2transport\b)(?!.*\.100)(?!.*\.200)(?!.*\.300)(?!.*\.400).*$/ )
    print $line1;
Run Code Online (Sandbox Code Playgroud)

我可以创建一个方法并传递搜索条件以返回true或false ....

(注意:我想使用C++的原因是因为它更快)解释与编译

(更新2017-05-16:在这个例子中,C++并不比Perl快.脚本的速度只取决于你用两种语言排列代码的方式.在我的例子中,Perl在这种情况下实际上比C++更快.两种语言都使用了正则表达式和相同类型的布局.即使我使用了boost库,C++也显得非常慢.)

sma*_*c89 5

正如其他人所提到的,当你在C++中编写正则表达式时,你不需要两个正斜杠.我还将添加另一个解决方案,即您可以使用Raw String文字来编写正则表达式.

例如:

std::string line1 = "interface GigabitEthernet0/0/0/3.50 l2transport";
std::regex pattern (R"(^(?=.*\binterface\b)(?=.*\bl2transport\b)(?!.*\.100)(?!.*\.200)(?!.*\.300)(?!.*\.400).*$)");
if (std::regex_match(line1, pattern)) {
    std::cout << line1 << '\n';
}
Run Code Online (Sandbox Code Playgroud)

通过使用原始字符串,可以防止C++解释字符串中的转义字符,因此正则表达式保持不变.