【问题标题】:how to do boost perl regex matching having support for case sensitive/insensitive如何在支持区分大小写/不区分大小写的情况下提升 perl 正则表达式匹配
【发布时间】: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

但这并没有按预期工作。我预计“ma​​tched”也应该是 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,如果您只想进行模式匹配,则不需要它。

标签: c++ regex perl boost


【解决方案1】:

根据 Boost 正则表达式功能的this example in the documentation,模式周围不应有斜线,并且您不能像在 Perl 中使用模式创建运算符 m// 那样将标志传递给模式字符串中的模式。

regex expression("^([0-9]+)(\\-| |$)(.*)$");

Boost's documentation about PCRE 表示默认情况下,模式区分大小写。这支持了我的假设,即您不能在模式本身内传递像 /i 这样的标志。相反,您需要将其作为标志作为第二个参数传递给模式构造函数,如SYNOPSIS 所示。

// e2 a case insensitive Perl regular expression:
boost::regex e2(my_expression, boost::regex::perl|boost::regex::icase);

可在here 获得 Boost 中 PCRE 的这些标志的完整列表。请注意,并非所有这些都映射到当前 Perls 中可以位于 m//s/// 上的实际修饰符标志,如 perlre 中所述。这是因为PCRE 不是 Perl,而是Perl 兼容的正则表达式引擎

【讨论】:

  • 我通过谷歌搜索的文档获得了所有这些信息。
  • 一切都很好。 boost 是一组主要且非常受人尊敬的功能完善的库,其中许多实际上扩展了语言,并经常说明下一个标准的内容。
【解决方案2】:

自 C++11 以来就有标准正则表达式机制。 我个人更喜欢这个而不是 boost 或任何其他第三方库。当然这只是我个人的看法。

如果您想使用 C++11 提供的实用程序,您可以执行以下操作

#include <iostream>
#include <string>
#include <regex>

int main(int argc, char** argv)
{
  std::string input = "rst";
  std::regex regex_pattern("^rst", std::regex_constants::icase); // use ::icase to make the matching case insensitive like /i in perl

  if ( std::regex_match(input, regex_pattern) )
  {
    std::cout << "matched!\n";
  }
  else
  {
    std::cout << "not matched!\n";
  }

  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多