查找匹配的子字符串到正则表达式

时间:2015-04-10 02:31:04

标签: c regex substring

假设我有一个从子串构建的长字符串,这些字符串都匹配一些正则表达式。

例如,我有2个正则表达式:

标识符:^[a-z]\S

接线员:^(:|;|*)

给出以下字符串:

a12vc+adh*v15

我希望获得所有匹配的项目,例如:

While(hasNextRegex(str)) {
  printf("%s\n", nextRegex(str));
} 

将打印:

a12vc   (first match) 
+       (second match) 
adh     (third match) 
*       (fourth match) 
v15     (fifth match) 

我正在使用slre库来进行正则表达式。仅限C语言。

你对我的要求有什么想法吗?提前致谢!!

1 个答案:

答案 0 :(得分:0)

SLRE一起分发的README.md中的文档包含使用单个RE进行迭代搜索的示例。您需要决定需要使用的RE并应用该示例中显示的技术。

鉴于字符串a12vc+adh*v15将产生值:

  1. a12vc
  2. +
  3. adh
  4. *
  5. v15
  6. 您需要一个能识别标识符(初始字母,后续字母数字)和运算符(单个标点字符)的正则表达式。 SLRE文档表明SLRE不支持\w

    因此,标识符匹配(如果使用不区分大小写):

    [a-z][a-z0-9]*
    

    如果需要/需要,您可以在模式中添加下划线。

    运营商包括:

    [*+-/;:]
    

    因此,应该有效的正则表达式是:

    ([a-z][a-z0-9]*|[*+-/;:])
    

    因此,示例中的代码可以适用于:

    #include "slre.h"
    #include <stdio.h>
    
    int main(void)
    {
        static const char str[] = "a12vc+adh*v15";
        static const char regex[] = "([a-z][a-z0-9]*|[*+-/;:])";
        struct slre_cap caps[1];
        int str_len = sizeof(str) - 1;
        const char *base = str;
        const char *end = str + sizeof(str);
    
        while (base < end)
        {
            int len = slre_match(regex, base, str_len, caps, 1, SLRE_IGNORE_CASE);
            if (len <= 0)
                break;
            printf("Found token: [%.*s]\n", caps[0].len, caps[0].ptr);
            base += len;
            str_len -= len;
        }
        return 0;
    }
    

    示例输出:

    Found token: [a12vc]
    Found token: [+]
    Found token: [adh]
    Found token: [*]
    Found token: [v15]
    

    这看起来像是要求的。