代码之家  ›  专栏  ›  技术社区  ›  GoinOff

c语言正则表达式匹配字符串的多个部分

  •  0
  • GoinOff  · 技术社区  · 7 年前

    c 我无法让正则表达式匹配以我想要的方式工作的程序。基本上,我想匹配中的第一个字符(W或M) testStr

    #include    <stdio.h>
    #include    <stdlib.h>
    #include    <regex.h>
    #define     MAX_MATCHES 2
    .....
    char testStr[20]="W TESTY.LOG ";
    char temp[100];
    int reti;
    regex_t regex;
    regmatch_t matches[MAX_MATCHES];
    int i;
    int numchars;
    
    /* Compile regular expression */
    reti = regcomp(&regex, "^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$", REG_EXTENDED);
    /* Execute regular expression */
    reti = regexec(&regex, testStr, MAX_MATCHES, matches, 0);
    if (!reti) {
      for (i=0; i < MAX_MATCHES; i++) {
        numchars = (int)matches[i].rm_eo - (int)matches[i].rm_so;
        strncpy(temp,testStr+matches[i].rm_so,numchars);
        temp[numchars] = '\0';
      }
    }
    

    当我在gdb中运行此命令时,我会看到以下匹配项:

    (gdb) display matches 1: matches = {{rm_so = 0, rm_eo = 15}, {rm_so = 0, rm_eo = 1}}

    2: temp = "W TESTY.LOG"

    2: temp = "W"

    所以,我得到了第一个字符,但是我没有得到第二个匹配的日志文件名。我在perl中使用regex,但对ansic中的regex还不熟悉。我觉得我缺少一些基本的东西。

    1 回复  |  直到 7 年前
        1
  •  2
  •   rici    7 年前

    匹配0是字符串中与整个regex(Perl)匹配的部分 $& ). 匹配 对于 &燃气轮机;0是与捕获编号对应的匹配部分 ,与Perl的相同 $1, $2, … . 您有两个捕获,因此应该有三个匹配项。但是您将MAX\u MATCH指定为2,因此最后一个匹配将被丢弃。


    另外,正则表达式

    ^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$
    

    [W|M] 匹配三个字符中的任何一个 W型 | . 同样地, [A-Z|0-9|\.]{1,} 匹配字母、数字和字符中的一个或多个 或者角色 .

    反斜杠是不相关的,因为它只是逃避 . -Wall

    也, {1,} +

    简而言之,你可能想要的是:

    reti = regcomp(&regex, "^([WM])[[:space:]]([A-Z0-9.]+)[[:space:]]*$", REG_EXTENDED)
    

    你也可以用

    reti = regcomp(&regex, "^([WM])[[:space:]]([[:alnum:].]+)[[:space:]]*$", REG_EXTENDED)