Tag: 模式匹配

C正则表达式:提取实际匹配

我在C中使用正则表达式(使用“regex.h”库)。 在为regcomp(…)和regexec(…)设置标准调用(和检查)之后,我只能设法打印与我编译的正则表达式匹配的实际子字符串。 根据手册页,使用regexec意味着将子串匹配存储在称为“regmatch_t”的结构中。 结构只包含rm_so和rm_eo来引用我所理解的内存中匹配子字符串的字符地址,但我的问题是如何使用这些来抵消和两个指针来提取实际的子字符串并将其存储到一个数组(理想情况下是一个2D字符串数组)? 它只在您打印到标准输出时有效,但每当您尝试使用相同的设置但将其存储在字符串/字符数组中时,它会存储最初用于匹配表达式的整个字符串。 此外,打印声明中的“%。* s”是什么? 我想这是正确读取字符数组指针的正则表达式。 我只想将匹配的子串存储在一个集合中,这样我就可以在我的软件中的其他地方使用它们了。 背景:p和p2都指向设置为指向字符串开头的指针,然后在下面的代码中输入while循环:[编辑:“匹配”是一个2D数组,意味着最终存储子字符串匹配并被预先分配/初始化在主循环之前,你看到下面] int ind = 0; while(1){ regExErr1 = regexec(&r, p, 10, m, 0); //printf(“Did match regular expr, value %i\n”, regExErr1); if( regExErr1 != 0 ){ fprintf(stderr, “No more matches with the inherent regular expression!\n”); break; } printf(“What was found was: “); int i = 0; while(1){ […]

在C中匹配二进制模式

我正在开发一个需要解析一些定制数据结构的C程序,幸运的是我知道它们是如何构造的,但是我不知道如何在C中实现我的解析器。 每个结构的长度为32位,每个结构都可以通过它的二进制签名来识别。 例如,我感兴趣的有两种特殊结构,它们具有以下二进制模式(x表示0或1) 0000-00xx-xxxx-xxx0 0000-10xx-10xx-xxx0 在这些结构中,’x’位包含我需要的实际数据,因此基本上我需要一种基于每个结构中如何写入位来识别每个结构的方法。 所以作为伪代码中的一个例子: if (binaryPattern = 000010xxxxxxxxx0) { do something with it; } 我猜测将它们作为整数读取,然后执行某种bitmasking将是要走的路,但我对C的了解不是很好,也许一个简单的逻辑OR运算就可以做到,但我只想要一些在我开始之前做这个的建议。 谢谢 非常感谢所有回答的人,非常有帮助!

使用后缀数组和LCP(-LR)实现字符串模式匹配

在过去的几周里,我试图弄清楚如何在另一个字符串中有效地找到字符串模式。 我发现很长一段时间,最有效的方法是使用后缀树。 但是,由于这种数据结构在空间上非常昂贵,我进一步研究了后缀数组的使用(使用的空间要少得多)。 不同的论文,如“后缀数组:一种新的在线字符串搜索方法”(Manber&Myers,1993)指出,搜索子字符串可以在O(P + log(N))中实现(其中P是通过使用二进制搜索和后缀数组以及LCP数组,模式的长度和N是字符串的长度。 我特别研究了后一篇论文来理解搜索算法。 这个答案在帮助我理解算法方面做得很好(顺便把它变成了LCP维基百科页面 )。 但我仍在寻找实现此算法的方法。 特别是所提到的LCP-LRarrays的构造看起来非常复杂。 参考文献: Manber&Myers,1993:Manber,Udi; Myers,Gene,SIAM Journal on Computing,1993,Vol.22(5),pp.935-948, http: //epubs.siam.org/doi/pdf/10.1137/0222058 更新1 只是为了强调我感兴趣的东西:我理解LCP数组,并找到了实现它们的方法。 但是,“普通”LCParrays不适合有效的模式匹配(如参考文献中所述)。 因此,我对实现LCP-LRarrays感兴趣,这似乎比实现LCParrays复杂得多 更新2 添加了参考文件的链接

如何使用PCRE获取所有匹配组?

我没有使用C的经验,我需要使用PCRE来获得匹配。 以下是我的源代码示例: int test2() { const char *error; int erroffset; pcre *re; int rc; int i; int ovector[OVECCOUNT]; char *regex = “From:([^@]+)@([^\r]+)”; char str[] = “From:regular.expressions@example.com\r\n”\ “From:exddd@43434.com\r\n”\ “From:7853456@exgem.com\r\n”; re = pcre_compile ( regex, /* the pattern */ 0, /* default options */ &error, /* for error message */ &erroffset, /* for error offset */ 0); […]