gpt4 book ai didi

c - 用于识别 C 中变量声明的正则表达式

转载 作者:行者123 更新时间:2023-12-01 01:26:34 27 4
gpt4 key购买 nike

我正在研究一个正则表达式来识别 C 中的变量声明,我得到了这个。

[a-zA-Z_][a-zA-Z0-9]*

有没有更好的解决办法?

最佳答案

在 C 中识别 变量声明的模式 。查看常规声明,我们看到:

int variable;

如果是这种情况,应该在任何事情之前测试 类型的 关键字,以避免匹配其他内容,例如用预处理器定义的字符串或常量
(?:\w+\s+)([a-zA-Z_][a-zA-Z0-9]+)

变量名位于\1。

您需要的功能是后视/前瞻。

更新 2015 年 7 月 11 日

之前的正则表达式无法将某些变量与中间任何位置的 _ 匹配。要解决这个问题,只需将 _ 添加到第一个捕获组的第二部分,它还假定变量名称为两个或多个字符,这是修复后的样子:
(?:\w+\s+)([a-zA-Z_][a-zA-Z0-9_]*)

但是,这个正则表达式有很多误报, goto jump; 就是其中之一,坦白说它不适合这项工作,因此,我决定创建另一个正则表达式来覆盖更广泛的情况,尽管它远非完美,在这里是:
\b(?:(?:auto\s*|const\s*|unsigned\s*|signed\s*|register\s*|volatile\s*|static\s*|void\s*|short\s*|long\s*|char\s*|int\s*|float\s*|double\s*|_Bool\s*|complex\s*)+)(?:\s+\*?\*?\s*)([a-zA-Z_][a-zA-Z0-9_]*)\s*[\[;,=)]

我已经用 Ruby、Python 和 JavaScript 测试了这个正则表达式,它在常见情况下工作得很好,但在某些情况下会失败。此外,正则表达式可能需要一些优化,尽管很难在保持跨多个正则表达式引擎的可移植性的同时进行优化。

测试恢复
unsignedchar *var;                   /* OK, doesn't match */
goto **label; /* OK, doesn't match */
int function(); /* OK, doesn't match */
char **a_pointer_to_a_pointer; /* OK, matches +a_pointer_to_a_pointer+ */
register unsigned char *variable; /* OK, matches +variable+ */
long long factorial(int n) /* OK, matches +n+ */
int main(int argc, int *argv[]) /* OK, matches +argc+ and +argv+ (needs two passes) */
const * char var; /* OK, matches +var+, however, it doesn't consider +const *+ as part of the declaration */
int i=0, j=0; /* 50%, matches +i+ but it will not match j after the first pass */
int (*functionPtr)(int,int); /* FAIL, doesn't match (too complex) */

误报

以下情况很难用可移植的正则表达式覆盖,文本编辑器使用上下文来避免突出显示引号内的文本。
printf("int i=%d", i);               /* FAIL, match i inside quotes */

误报(语法错误)

如果在应用正则表达式之前测试源文件的语法,则可以解决此问题。使用 GCC 和 Clang 可以只通过 -fsyntax-only 标志来测试源文件的语法而不编译它
int char variable;                  /* matches +variable+ */

关于c - 用于识别 C 中变量声明的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12993187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com