正则表达式库,在一次运行中为C ++返回多个模式的所有匹配项?

时间:2009-07-27 09:47:07

标签: c++ regex parsing

我正在为C ++寻找一个正则表达式(或其他东西)库,它允许我指定一些模式,在字符串上运行并返回所有模式的匹配位置。

例如: 模式{“abcd”,“abcd”} 字符串{“abcd abce abcd”}

结果: abcd比赛:0-3,11-14 abce匹配:5-9

有人知道这样的图书馆吗?

4 个答案:

答案 0 :(得分:2)

我推荐使用boost :: xpressive http://www.boost.org/doc/libs/1_39_0/doc/html/xpressive.html

可能的解决方案之一:

string text = "abcd abce abcd";

static const sregex abcd = as_xpr("abcd");  // static - faster
sregex abce = sregex::compile( "abce" )  // compiled 
sregex all = *(keep(abcd) | keep(abce));

smatch what;

if( regex_match( text, what, all ) ) 
{
    smatch::nested_results_type::const_iterator begin = what.nested_results().begin();
    smatch::nested_results_type::const_iterator end = what.nested_results().end();

    for(;it != end; it++)
    {
        if(it->regex_id() == abcd.regex_id())
        {
            // you match abcd
            // use it->begin() and it->end()
            // or it->position() and it->length()
            continue;
        }
        if(it->regex_id() == abce.regex_id())
        {
            // you match abcd...
            continue;
        };

}

我认为这不是最佳解决方案,您可以在文档中查看“语义操作和用户定义的断言”。

答案 1 :(得分:0)

答案 2 :(得分:0)

正则表达式是标准扩展tr1的一部分,并在许多标准库中实现(即dinkumware

我认为自己编写周围代码非常简单。

答案 3 :(得分:0)

不适用于简单的

"abcd|abcd"

这是一个有效的正则表达式。