以下正则表达式语句在使用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 ++似乎也非常慢。)
答案 0 :(得分:5)
正如其他人所提到的,当你在C ++中编写正则表达式时,你不需要两个正斜杠。我还将添加另一个解决方案,即您可以使用R
aw 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)
要生成字符串/* 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..."
。
regex("...\\b...")
实际上并不是模式的一部分。 (在Perl中,它是接受正则表达式模式的运算符之一。)因此,除非您想匹配/
,否则它们在此处没有使用任何业务。
/