Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C+中编写正则表达式时如何避免反斜杠转义+;_C++_C_Regex - Fatal编程技术网

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

C++ 在C/C+中编写正则表达式时如何避免反斜杠转义+;,c++,c,regex,C++,C,Regex,对于正则表达式\w+\d,在许多脚本语言(如perl/python)中,它可以按字面意思编写。但在C/C++中,我必须将其编写为: const char *re_str = "\\w+\\d"; 这看起来很难看 有什么办法可以避免吗?宏也是可以接受的。< P>不。C++中只有一种字符串文字,它是处理转义字符的类型。 < P>可以将ReGEXP放入文件中,如果有很多或需要经常修改它们,请读取该文件。这是我唯一能避免反斜杠的方法。 < P>作为FYI,下一个C++标准(C++ 0x)将有一些东西,

对于正则表达式\w+\d,在许多脚本语言(如perl/python)中,它可以按字面意思编写。但在C/C++中,我必须将其编写为:

const char *re_str = "\\w+\\d";
这看起来很难看


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

< P>不。C++中只有一种字符串文字,它是处理转义字符的类型。

< P>可以将ReGEXP放入文件中,如果有很多或需要经常修改它们,请读取该文件。这是我唯一能避免反斜杠的方法。

< P>作为FYI,下一个C++标准(C++ 0x)将有一些东西,它应该让你做一些类似的事情:

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

但是在那之前,我认为如果你想让正则表达式成为源文件中的一个文本,你就得忍受将反斜杠加倍的痛苦。

当我阅读[C:参考手册]第3章:预印本时。出现了一个想法:

 #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++中都是移植性的,只使用标准的预处理特征。诀窍是使用宏在文字字符串内展开\然后删除前导和尾随双引号字符串

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


副作用是,我们不能在C中的全局范围中定义这样的变量。因为有一个语句可以删除尾部双引号字符。C++中没问题。 这是字符数组文字的语言语法。另一种选择可能更糟糕:
'\'、'w'、'+'、'\'、'd'、'\0'
@Amardeph:
'\'
甚至都能工作吗?这难道不会被误解为
\'
?@sbi:你说得很对。转义不仅限于双引号文字,还影响字符文字。我应该知道的,因为我将\0放在那里作为终止符。:-)伟大的谢谢,这是我关于C++的梦想。但不幸的是,它目前不可用,对于C来说更糟糕。我用vc2010检查它,它还不支持:错误C3861:“R”:标识符未找到这是真正的解决方案。前后兼容。这个宏有什么缺点吗?使用它不安全吗?我能看到的唯一潜在缺点是,以这种方式创建的模式表达式是可修改的。