开发者

How to avoid backslash escape when writing regular expression in C/C++

For regular expression \w+\d, in many script language such as perl/python it can be written literally. But in C/C++, I must write it as:

const char *re_str = "\\w+\\d";

which is ugly to eye.

Is there any method to av开发者_StackOverflowoid it? MACRO are also acceptable.


Just as an FYI, the next C++ standard (C++ 0x) will have something called raw string literals which should let you do something like:

const char *re_str = R"(\w+\d)";

However until then I think you're stuck with the pain of doubling up your backslashes if you want the regex to be a literal in the source file.


When I reading [C: A reference manual] Chapter 3: Prepressors. An idea emerges:

 #define STR(a) #a
 #define R(var, re)  static char var##_[] = STR(re);\
 const char * var = ( var##_[ sizeof(var##_) - 2] = '\0',  (var##_ + 1) );

 R(re, "\w\d");
 printf("Hello, world[%s]\n",  re);

It's portable in both C and C++, only uses standard preprocessing features. The trick is to use macro to expand \ inside liternal string and then remove the leading and tailing double quote strings.

Now I think it's the best way until C++0x really introduce the new literal string syntax R"...". And for C I think it'll be the best way for a long time.

The side effect is that we cannot defined such a variable in the global scope in C. Because there's a statement to remove the tailing double-quote character. In C++ it's OK.


You can put your regexp in a file and read the file if you have a lot or need to modify them often. That's the only way I see to avoid backslashes.


No. There is only one kind of string literals in C++, and it's the kind that treats escaped characters.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜