2

この式に一致するすべての部分文字列を取得したい: 1[0]+1

std::string str =  "0011011000001";
std::regex rx   ("1[0]+1");
std::smatch res;
std::regex_search(str, res, rx);
for (size_t i=0; i<res.size(); i++)
std::cout<<res[i]<<std::endl;

しかし、最初の部分文字列のみが返されます。私は何を間違っていますか?

4

2 に答える 2

1

すべての部分文字列を取得するには、これを行う必要があります。

while (std::regex_search (str,res,rx)) {
    std::cout <<res[0] << std::endl;
    str = res.suffix().str();
}

または、以下のように std::regex_iterator を使用してすべての部分文字列を取得できます。

std::regex_iterator<std::string::iterator> rit ( str.begin(), str.end(), rx);
std::regex_iterator<std::string::iterator> rend;

while (rit != rend) {
    std::cout << rit->str() << std::endl;
    ++rit;
}

ただし、最初の一致で文字列の一部が消費されるため、文字列が「00110101000001」の場合でも「101」と「1000001」が出力されます。重複する一致をすべて見つけたい場合は、Lookaround Assertionをサポートする正規表現の実装が必要です。Python は次のことを行います。

>>> re.findall(r'(?=(1[0]+1))', '00110101000001')
['101', '101', '1000001']

(?=...) ... が次に一致する場合に一致しますが、文字列を消費しません。これは、先読みアサーションと呼ばれます。たとえば、Isaac (?=Asimov) は、後に「Asimov」が続く場合にのみ「Isaac」と一致します。

于 2013-10-02T00:32:27.427 に答える
0

マッチを貪欲にしないでください...

std::regex rx   ("(1[0]+1)?");
于 2013-10-02T05:16:23.560 に答える