Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++_Regex - Fatal编程技术网

C++ 在C+中查找类声明的正则表达式+;代码

C++ 在C+中查找类声明的正则表达式+;代码,c++,regex,C++,Regex,我需要一个正则表达式来查找类声明,以便在“class”关键字之前添加一个#define。正则表达式不必是完美的,只要足够好,就可以捕获大多数情况。怎么样: /^\s*class\s/ 这应该相当有效。我不太确定 /class\s+([^\s]+)/ 这将把类名捕获为$1(或您正在使用的任何regex框架中的等效名称)。对于在类名称后面的中可能有空格的模板类,这将不起作用。解析正则表达式是不可行的,因为它需要匹配平衡的尖括号对 /.*class\s+([^{]+)\s*[:]?([^{]+){

我需要一个正则表达式来查找类声明,以便在“class”关键字之前添加一个#define。正则表达式不必是完美的,只要足够好,就可以捕获大多数情况。

怎么样:

/^\s*class\s/
这应该相当有效。我不太确定

/class\s+([^\s]+)/
这将把类名捕获为$1(或您正在使用的任何regex框架中的等效名称)。对于在类名称后面的中可能有空格的模板类,这将不起作用。解析正则表达式是不可行的,因为它需要匹配平衡的尖括号对

/.*class\s+([^{]+)\s*[:]?([^{]+){/

这适用于大多数类定义,包括模板类。类名在$1中捕获,如果它是派生类,则基类将在$2中。

Yannick的回答主要涉及它,但不幸的是,它还匹配转发声明(以及它们下面的后续文本)和严格枚举,即
枚举类myStrictEnum{//stuff}

这很有效,而且足够严格,但可以说比需要的更详细

^(?!enum).*class\b\s\b[A-Za-z_][A-Za-z_0-9]*\b\s*($)?(|:\s*($)?(public|private|protected)\s*($)?\b[^{]*\s*)\s*($)?{

正则表达式应该匹配整个(可能是多行)声明,还是只匹配class关键字?后者很容易得到大部分正确答案;对于前者,正则表达式可能是错误的工具。