有没有办法让捕获在正则表达式中重复任意次数?

时间:2009-08-24 16:42:03

标签: c++ regex capture

我正在使用带有ECMA正则表达式语法的C ++ tr1 :: regex。我要做的是解析标题并返回与标题中每个项目相关联的值。

部首:

-Testing some text
-Numbers 1 2 5
-MoreStuff some more text
-Numbers 1 10

我想要做的是找到所有“-Numbers”行,并使用单个正则表达式将每个数字放入自己的结果中。如您所见,“-Numbers”行可以在行上具有任意数量的值。目前,我只是在搜索“-Numbers([\ s0-9] +)”,然后对该结果进行标记。我只是想知道是否有任何方法可以在单个正则表达式中查找和标记结果。

3 个答案:

答案 0 :(得分:2)

不,没有。

答案 1 :(得分:0)

我正要问这个完全相同的问题,我找到了一个解决方案。

假设您要捕获任意数量的单词。

“有四盏灯”

“队长皮卡德是炸弹”

您可能认为解决方案是:

/((\w+)\s?)+/

但这只会匹配整个输入字符串和最后捕获的组。

您可以使用“g”开关。

所以,Perl中的一个例子:

use strict;
use warnings;

my $str1 = "there are four lights";
my $str2 = "captain picard is the bomb";

foreach ( $str1, $str2 ) {
    my @a = ( $_ =~ /(\w+)\s?/g );
    print "captured groups are: " . join( "|", @a ) . "\n";
}

输出是:

captured groups are: there|are|four|lights
captured groups are: captain|picard|is|the|bomb

所以,如果您选择的语言支持相当于“g”(我猜大多数都是......),那么就有一个解决方案。

希望这有助于与我处于同一位置的人!

S

答案 2 :(得分:0)

问题是所需解决方案坚持使用捕获组。 C ++提供了regex_token_iterator工具来更好地处理此问题(C ++ 11示例):

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

using namespace std;

int main() {
    std::regex e (R"((?:^-Numbers)?\s*(\d+))");

    string input;

    while (getline(cin, input)) {
        std::regex_token_iterator<std::string::iterator> a{
            input.begin(), input.end(),
            e, 1,
            regex_constants::match_continuous
        };

        std::regex_token_iterator<std::string::iterator> end;
        while (a != end) {
            cout << *a << " - ";
            ++a;
        }
        cout << '\n';
    }

    return 0;
}

https://wandbox.org/permlink/TzVEqykXP1eYdo1c