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

时间:2010-10-20 13:31:10

标签: c++ c regex

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

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

这是丑陋的。

有什么方法可以避免吗? MACRO也是可以接受的。

4 个答案:

答案 0 :(得分:9)

正如FYI一样,下一个C ++标准(C ++ 0x)会有一些名为raw string literals的东西,可以让你做类似的事情:

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

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

答案 1 :(得分: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);

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

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

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

答案 2 :(得分:2)

如果您有很多或需要经常修改它们,您可以将正则表达式放在一个文件中并读取该文件。这是我看到避免反斜杠的唯一方法。

答案 3 :(得分:1)

没有。 C ++中只有一种字符串文字,它是处理转义字符的那种。