在C/C++中编写正则表达式时如何避免反斜杠转义

zha*_*fei 2 c c++ regex

对于正则表达式\ w +\d,在许多脚本语言中,例如perl/python,它可以按字面编写.但是在C/C++中,我必须把它写成:

const char *re_str = "\\w+\\d";
Run Code Online (Sandbox Code Playgroud)

这是丑陋的眼睛.

有什么办法可以避免吗?MACRO也可以接受.

Mic*_*urr 9

就像一个FYI,下一个C++标准(C++ 0x)将有一些称为原始字符串文字的东西,它可以让你做类似的事情:

const char *re_str = R"(\w+\d)";
Run Code Online (Sandbox Code Playgroud)

但是在那之前,如果你想让正则表达式成为源文件中的文字,我认为你会遇到加倍反斜杠的痛苦.


zha*_*fei 7

当我阅读[C:参考手册]第3章:Prepressors.出现了一个想法:

 #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);
Run Code Online (Sandbox Code Playgroud)

它在C和C++中都是可移植的,只使用标准的预处理功能.诀窍是使用宏来扩展\ insidenn字符串,然后删除前导和尾随双引号字符串.

现在我认为这是最好的方法,直到C++ 0x真正引入新的文字字符串语法R"......".CI认为这将是很长一段时间内最好的方式.

副作用是我们无法在C中的全局范围中定义这样的变量.因为有一个语句来删除尾部双引号字符.在C++中没关系.