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

时间:2016-11-29 02:56:33

标签: c++ regex

以下正则表达式语句在使用perl时匹配,但在使用c ++时它不匹配。阅读" std :: regex" cplusplus.com上的类信息,我可能不得不使用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;

perl的

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

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

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

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

3 个答案:

答案 0 :(得分: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';
}

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

答案 1 :(得分:4)

@craig年轻是正确的。 c ++中的正则表达式“\”字符需要双斜杠“\”

而且,当使用c ++时,没有必要在语句周围加上外部“/”。我使用下面的代码使其匹配...谢谢

if (std::regex_match(line1, regex("^(?=.*\\binterface\\b)(?=.*\\bl2transport\\b)(?!.*\\.100)(?!.*\\.200)(?!.*\\.300)(?!.*\\.400).*$")))

答案 2 :(得分:3)

问题1

要生成字符串/* Always set the map height explicitly to define the size of the div * element that contains the map. */ #map { height: 100%; } /* Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } ,需要使用字符串文字...\b...。就像您在Perl中使用"...\\b..."一样,您需要在C ++中使用$s =~ "...\\b..."

问题2

regex("...\\b...")实际上并不是模式的一部分。 (在Perl中,它是接受正则表达式模式的运算符之一。)因此,除非您想匹配/,否则它们在此处没有使用任何业务。

固定和简化

/