Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this C++11 regex error me or the compiler?

Tags:

c++

regex

gcc

c++11

People also ask

Is regex used in compilers?

A language uses regular expressions to define the syntax, i.e., whether all texts in the text program are good or not. The task of the compiler is to translate those texts to machine code following the rule of the language definition. The first two steps of a compiler are lexical analysis and parse.

What is regex error?

If you make an error in your regex syntax, the Microsoft engine will trigger an exception. The exception class that is triggered is the System. ArgumentException class (used for any method with argument exceptions).

What does regex mean in C++?

Regular Expression (regex) In C++ A regular expression or regex is an expression containing a sequence of characters that define a particular search pattern that can be used in string searching algorithms, find or find/replace algorithms, etc. Regexes are also used for input validation.

What is boost regex?

Boost. Regex allows you to use regular expressions in C++. As the library is part of the standard library since C++11, you don't depend on Boost. Regex if your development environment supports C++11.


Update: <regex> is now implemented and released in GCC 4.9.0


Old answer:

ECMAScript syntax accepts [0-9], \s, \w, etc, see ECMA-262 (15.10). Here's an example with boost::regex that also uses the ECMAScript syntax by default:

#include <boost/regex.hpp>

int main(int argc, char* argv[]) {
  using namespace boost;
  regex e("[0-9]");
  return argc > 1 ? !regex_match(argv[1], e) : 2;
}

It works:

$ g++ -std=c++0x *.cc -lboost_regex && ./a.out 1

According to the C++11 standard (28.8.2) basic_regex() uses regex_constants::ECMAScript flag by default so it must understand this syntax.

Is this C++11 regex error me or the compiler?

gcc-4.6.1 doesn't support c++11 regular expressions (28.13).


The error is because creating a regex by default uses ECMAScript syntax for the expression, which doesn't support brackets. You should declare the expression with the basic or extended flag:

std::regex r4("[0-9]", std::regex_constants::basic);

Edit Seems like libstdc++ (part of GCC, and the library that handles all C++ stuff) doesn't fully implement regular expressions yet. In their status document they say that Modified ECMAScript regular expression grammar is not implemented yet.


Regex support improved between gcc 4.8.2 and 4.9.2. For example, the regex =[A-Z]{3} was failing for me with:

Regex error

After upgrading to gcc 4.9.2, it works as expected.