3

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

标题:

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

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

4

3 回答 3

3

不,那里没有。

于 2009-08-24T19:26:01.083 回答
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”的等价物(我猜大多数人都这样做......),那么就有一个解决方案。

希望这可以帮助与我处于同一位置的人!

小号

于 2011-08-31T13:15:28.460 回答
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

于 2018-08-01T20:38:20.040 回答