【发布时间】:2017-08-04 10:15:20
【问题描述】:
我想在 boost regex 或 cpp 中的任何其他替代方案中实现以下 perl 评估。
#!/usr/bin/perl
use strict;
use warnings;
my $regex_pattern = "/^rst/i";
my $name = "rst";
my $match;
my $tmpRegExp = "\$match = (\$name =~ $regex_pattern);";
eval ($tmpRegExp);
if(!$match) {
print "not matched\n";
} else {
print "matched\n";
}
Perl 输出
% perl perl_regex.pl
matched
我试过下面的示例代码
#include <boost/regex.hpp>
#include <string>
#include <iostream>
int main()
{
std::string regex_pattern("/^rst/i");
std::string name("rst");
boost::regex regex_expr(regex_pattern, boost::regex::perl);
bool match = boost::regex_search(name, regex_expr);
if(match)
std::cout << "matched" << std::endl;
else
std::cout << "not matched" << std::endl;
return 0;
}
C++ 输出
% g++ boost_regex.cpp -l boost_regex
% ./a.out
not matched
但这并没有按预期工作。我预计“matched”也应该是 boost 版本的结果。这个 regex_pattern 是一个 perl 正则表达式用户变量。 谁能帮忙,哪里出错了?
【问题讨论】:
-
这个 Perl 代码所做的就是将模式匹配的返回值赋给
$match变量。它是1或空字符串""。模式中没有任何特定于 Perl 的内容。它有一个字符串锚的开头和一个/i标志。这些都是非常通用的,应该在任何正则表达式引擎中实现。你这里有什么问题?你期望会发生什么?到底发生了什么?请edit您的问题更具体。 -
@simbabque 编辑了问题的更多细节。
-
Perl 代码中的
eval与它有什么关系?我不知道这个 boost 是什么,但我猜你的模式是错误的。如果此 boost 正则表达式实现具有调试模式,请将其打开并查看输出。 -
eval 是计算表达式的函数。 Boost 是扩展 C++ 库,用于实现正则表达式等高级功能。模式是否正确,您可以通过运行程序来检查。 perldoc.perl.org/functions/eval.html
-
eval与模式匹配无关。=~运算符进行模式匹配,m//构造一个模式。eval在您使用它的方式上是在做 string eval。您的 CPP 代码中没有字符串 eval,如果您只想进行模式匹配,则不需要它。