2016-10-04 11 views
1

私はstd :: regexを使用していて、ユーザー定義の正規表現文字列に一致する文字列の最後の位置を探したいとします。C++ reverse regex_search

例えば、正規表現:.*と文字列 "test:55:last"を指定すると、 ":last"ではなく ":55:last"を探したいと思います。

ユーザーが正規表現を提供したときに、正規表現と「逆」チェックボックスを追加するだけで、正規表現を変更できるようになりましたが、これはプログラム的な方法で行う必要があります。

+0

マッチ、それをこの方法: ':[^:] + $' – revo

+1

@revo:あなたは答えを投稿している場合に行ってください。私はすでにそれを書いたが、あなたのコメントを見た。 –

+0

OPが探しているのがこれなら – revo

答えて

3

あなたが変更することはできません、ユーザー提供の正規表現を持っていますが、あなたはまだ右端の一致が必要な場合は、(改行間で一致するか[\s\S]*^.*()のパターンをラップし、グラブキャプチャグループ1内容:

"^.*(:.*)" 

事は上記のパターンが

  • 01と一致していることであるregex demo

    を参照してください。- 文字列

  • .*の開始は - (あなたが[\s\S]*を使用している場合、すべての文字がマッチします)できるだけ多くの*があるので、貪欲数量詞)
  • (:.*)改行文字以外の任意の0+の文字にマッチします - :に一致し、改行文字以外の0以上の文字があるcapturing group。最初.*が実際に行の終わりまで、できるだけ多くの文字をつかむということ

注(ない改行がない場合、ほとんどのケースでは、それは文字列の末尾です)。バックトラックが発生すると、正規表現エンジンは後続のサブパターン(ここではユーザパターンになります)のテキストに対応しようとします。したがって、取得されるユーザサブパターンは、の右端の位置になります。これが動作する方法を示すexample (basic) C++ program

#include <regex> 
#include <string> 
#include <iostream> 
using namespace std; 

int main() { 
    string user_pattern(":.*"); 
    string s("test:55:last"); 
    regex r("^.*(" + user_pattern + ")"); 
    smatch matches; 
    if (regex_search(s, matches, r)) { 
     cout<<matches[1].str(); 
    } 
    return 0; 
} 
+0

バックトラック "トリック"について説明すると良いでしょう。 –

+0

申し訳ありませんが、私のChromeがクラッシュしました。追加したいのはすべて失われました:(もっと追加します) –

+0

'[\ s \ S] *'バージョンは、複数行文書では、最初の行ではなく最後の行から開始します)。 –