Understanding Regular Expression in C ++ 11

I am trying to learn regular expressions in C ++ 11. Something must be wrong because no brackets or escape sequences seem to work.

Here is my code:

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

using namespace std;

int main()
{
    try
    {
        cout << R"(\d*(\.\d*)?;)" << endl << endl;

        regex rx{ R"(\d*(\.\d*)?;)", regex_constants::ECMAScript };
        smatch m;

        if( regex_match( string( "10;20;30;40;" ), m, rx ) )
        {
            cout << m[0];
        }
    }
    catch( const regex_error &e )
    {
        cerr << e.what() << ". Code: " << e.code() << endl;

        switch( e.code() )
        {
        case regex_constants::error_collate:
            cerr << "The expression contained an invalid collating element name.";
            break;
        case regex_constants::error_ctype:
            cerr << "The expression contained an invalid character class name.";
            break;
        case regex_constants::error_escape:
            cerr << "The expression contained an invalid escaped character, or a trailing escape.";
            break;
        case regex_constants::error_backref:
            cerr << "The expression contained an invalid back reference.";
            break;
        case regex_constants::error_brack:
            cerr << "The expression contained mismatched brackets ([ and ]).";
            break;
        case regex_constants::error_paren:
            cerr << "The expression contained mismatched parentheses (( and )).";
            break;
        case regex_constants::error_brace:
            cerr << "The expression contained mismatched braces ({ and }).";
            break;
        case regex_constants::error_badbrace:
            cerr << "The expression contained an invalid range between braces ({ and }).";
            break;
        case regex_constants::error_range:
            cerr << "The expression contained an invalid character range.";
            break;
        case regex_constants::error_space:
            cerr << "There was insufficient memory to convert the expression into a finite state machine.";
            break;
        case regex_constants::error_badrepeat:
            cerr << "The expression contained a repeat specifier (one of *?+{) that was not preceded by a valid regular expression.";
            break;
        case regex_constants::error_complexity:
            cerr << "The complexity of an attempted match against a regular expression exceeded a pre-set level.";
            break;
        case regex_constants::error_stack:
            cerr << "There was insufficient memory to determine whether the regular expression could match the specified character sequence.";
            break;
        default:
            cerr << "Undefined.";
            break;

}

    cerr << endl;
}

    return 0;
}

Output:

\ d * (\ d *.) ;?

regex_error. Code: 2

The expression contains an invalid escaped character or trailing escape code.

What am I doing wrong?

Update

gcc version 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC)

clang version 3.3 (tags / RELEASE_33 / final)

libstdc ++ version 4.8.2

Decision

Well. I am reading "C ++ Programming Language" and wanted to experiment with the material std :: regex. So I guess the solution is to wait for gcc-4.9.

I gave EagleV_Attnam credit to indicate other errors in my code.

+4
2

:

  • "10;20;30;40;" match_regex. smatch, cmatch, , (, , string()) , .
  • ( , ). . . * ( , ) , ( R"((stuff)*)")

( gcc):

regex rx{ R"(\d*(\.\d*)?;.*)", regex_constants::ECMAScript };
smatch m;
string s("10;20;30;40;");
if (regex_match(s, m, rx))
{
    cout << m[0];
}

, - , KitsuneYMG , .

+1

, \, \d escape- . , R , undefined.

, GCC regexp , . , boost regexp.

    regex rx( "\\d*;" ); //regexp, must escape '\'
    string input = "10;20;30;40;";
    smatch m;

    if( regex_search( input, m, rx ) )
    {
        cout << m[0] << endl;
    } 
-2

Source: https://habr.com/ru/post/1534850/


All Articles