3

ECMA 正規表現文法で C++ tr1::regex を使用しています。私がやろうとしているのは、ヘッダーを解析し、ヘッダー内の各項目に関連付けられた値を返すことです。

ヘッダ:

-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」に相当するものをサポートしている場合は解決策があります(ほとんどの場合はサポートしていると思います...)。

これが私と同じ立場にあった誰かに役立つことを願っています!

S

于 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 に答える