Tag: 正则表达式

正则表达式库,用于维护状态,逐个字符地输入,并在找到匹配时返回true

我正在寻找一个在文本中进行正则表达式搜索的库。 我的约束是文本很大,并且在它们之间有几个控制字符。 所以我无法将整个文本传递给库。 我有类似getnextcharacter的东西,它在跳过控制字符后返回有效字符。

复杂正则表达式的分段错误 – Regex.h

我试图在一大块文本中找到URL regex_t reg; const char *regex=”REGEXGOESHERE”; regmatch_t matches[16]; //Read data into variable filecontent regcomp(&reg, regex, REG_EXTENDED); int offset=0; int j; int found=0; int start,end; while( regexec(&reg, filecontent+offset, 16, matches, 0) == 0) { printf(“\n\n”); start = matches[0].rm_so+offset; end = matches[0].rm_eo-1+offset; printf(“regex /%s/ at bytes %d-%d\n”, regex, start, end); for (j=start; j<=end; j++) { printf("%c",filecontent[j]); } […]

带有匹配括号的正则表达式

我正在尝试从C源代码中提取特定的硬编码变量。 我剩下的问题是我想解析数组初始化,例如: #define SOMEVAR { {T_X, {1, 2}}, {T_Y, {3, 4}} } 这足以将此示例解析为“{T_X,{1,2}}”和“{T_Y,{3,4}}”,因为这样可以递归以获得完整的结构。 但是,它需要足够通用,以便能够解析任何用户定义的类型。 更好的是正则表达式列表,可以用于来自一般C代码构造的额外值,如#define ,枚举和全局变量。 C代码是提供给我的,所以我无法控制它。 我宁愿不写一个一次解析一个字符的函数。 但是,有一系列正则表达式是可以的。 这不是将文件导入MATLAB或基本正则表达式的问题。 我正在使用特定的正则表达式来保留括号中的分组。 编辑:看起来正则表达式不进行递归或任意深度匹配。 根据这里和这里 。

用于在C中解析iCalendar文件的工具集

我需要在C中解析一个ics文件,并将逐行进行。 每条线的格式可能有很大不同,但通常都有标准。 以下是我注意到的一些规则: 有一个属性名称 可选参数,每个参数以分号开头 也可以有CSV 可以是双引号值,在这种情况下,需要忽略逗号,半冒号和冒号之类的内容 结肠 适当的价值 这是一个需要解析的示例ics组件: UID:uid1@example.com DTSTAMP:19970714T170000Z ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com CATEGORIES:Project Report, XYZ, Weekly Meeting DTSTART:19970714T170000Z DTEND:19970715T035959Z SUMMARY:Bastille Day Party 你会注意到像MAILTO这样的东西: 。 只解析第一个冒号,冒号之后的其余冒号是属性值。 使用类似strtok()的东西似乎是基本的,足以解决这个问题。 应该使用正则表达式来解决这个问题吗? outlook一下,我看到了一个在C#上完成这个正则表达式解决方案的例子。

如何使用正则表达式检测无效的C转义字符串?

我想找到一个正则表达式(正则表达式),它检测你是否在C双引号转义字符串中有一些无效的转义符(在这里你可以找到只引用的双引号)。 我认为有效\\ \n \r \” (测试字符串正在使用”) 对此的部分解决方案是使用(?<!\\)\\[^\"\\nr]但是这个无法检测到错误的转义,例如\\\ 。 这是我用来测试匹配的测试字符串: …\n…\\b…\”…\\\\…\\\E…\…\\\…\\\\\…”…\E… 表达式应该与最后6个块匹配为无效,前4个有效。 问题是我当前版本确实只发现2/5错误。

Lex:标识符与整数

我正在尝试创建自己的简单编程语言。 为此,我需要在Lex中插入一些正则表达式。 我正在使用以下正则表达式来匹配标识符和整数。 [a-zA-Z][a-zA-Z0-9]* /* identifier */ return IDENTIFIER; (“+”|”-“)?[0-9]+ /* integer */ return INTEGER; 现在当我检查一个非法的标识符,例如: 0a = 1; 前导零被识别为整数,后跟被识别为标识符的“a”。 而不是这个我希望这个标记’0a’被识别为非法字符。 如何包含此function? 我需要调整什么样的正则表达式?

IPv6地址的正则表达式

我有一个IPv6地址的正则表达式,如下所示 IPV4ADDRESS [ \t]*(([[:digit:]]{1,3}”.”){3}([[:digit:]]{1,3}))[ \t]* x4 ([[:xdigit:]]{1,4}) xseq ({x4}(:{x4}){0,7}) xpart ({xseq}|({xseq}::({xseq}?))|::{xseq}) IPV6ADDRESS [ \t]*({xpart}(“:”{IPV4ADDRESS})?)[ \t]* 它是正确的所有格式的IPv6地址,包括 1) non-compressed IPv6 addresses 2) compressed IPv6 addresses 3) IPv6 addresses in legacy formats.(supporting IPv4) 传统格式的IPv6地址的理想示例是 2001:1234::3210:5.6.7.8 OR 2001:1234:1234:5432:4578:5678:5.6.7.8 As you can see above there are 10 groups separated by either `”:” or “.”.` 与普通IPv6地址中的8组相反。这是因为最后4组由“”组成。 应该压缩成IPv6地址的最低32位。因此我们需要10组来满足128位。 但是,如果我使用以下地址格式 2001:1234:4563:3210:5.6.7.8 这里用“:”分隔的每个组代表16位。最后四个组用“。”分隔。 […]

使用Python检测C文件中的递归

我需要在一个相当大的(5-15,000)C(不是C ++)文件集中检测直接和间接递归。 这些文件已经过预处理。 出于安全原因,代码非常“老派”,因此没有像函数指针那样的花哨的东西,只有传递变量的函数和一些执行相同操作的函数宏。 检测递归的最自然的方法是制作一个有向调用图,考虑每个函数一个边缘的节点将转到它调用的所有其他函数。 如果图形有任何周期,那么我们有递归。 查找函数调用的正则表达式是微不足道的,但我还需要知道调用哪个函数。 PyCParser很不错,但它抱怨很多东西,比如未定义的变量或者typedef,其中源类型没有在不同的文件中定义或定义,这在我的用例中完全不相关。 该项目使用自定义依赖管理系统,因此有些包含,并且这些是自动添加的,所以我需要PyCParser不关心FuncCall和FuncDef节点以外的任何东西 ,我认为没有办法将解析过程本身限制为只是。 我宁愿不实现解析器,因为我没有时间学习如何在python中执行此操作然后实现解决方案。 回到问题,我将如何解析C文件中的函数? 基本上使用字符串(文件中定义的函数名称)作为键,以及字符串列表(每个函数调用的函数)作为值? 正则表达式似乎是最自然的解决方案。 使用python并不是可选的。

使用Python Regex在File中查找C函数

我试图让Python正则表达式搜索.c文件并获取其中的函数。 例如: int blahblah( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { … 我想把blahblah作为功​​能。 这个正则表达式对我不起作用,它一直给我None : r”([a-zA-Z0-9]*)\s*\([^()]*\)\s*{“

在C中编译/匹配POSIX正则表达式

我正在尝试匹配字符串pcode中的以下项目: u后面跟着一个或两位数字 phaseu phasep x (由非单词字符包围) y (由非单词字符包围) z (由非单词字符包围) 我尝试使用POSIX正则表达式函数实现正则表达式匹配(如下所示),但有两个问题: 编译后的模式似乎没有子模式(即compiled.n_sub == 0)。 该模式在字符串“u0”中找不到匹配项,它确实应该! 我确信正则表达式字符串本身正在工作 – 它在python和TextMate中工作 – 我的问题在于C语言中的编译等。任何帮助实现这一点都将非常感激。 提前感谢您的回答。 if(idata=tb_find(deftb,pdata)){ MESSAGE(“Global variable!\n”); char pattern[80] = “((u[0-9]{1,2})|(phaseu)|(phasep)|[\\W]+([xyz])[\\W]+)”; MESSAGE(“Pattern = \”%s\”\n”,pattern); regex_t compiled; if(regcomp(&compiled, pattern, 0) == 0){ MESSAGE(“Compiled regular expression \”%s\”.\n”, pattern); } int nsub = compiled.re_nsub; MESSAGE(“nsub = %d.\n”,nsub); regmatch_t matchptr[nsub]; int err; […]