1

为什么 \w 模式不能匹配?许多模式不能工作,例如:\s

我的操作系统是 Mac

我想可能会遗漏一些东西;

该代码仅匹配字符'w',不要山姆。

谢谢你的帮助

//
//  main.c
//  test
//
//  Created by SamPeng on 12-9-22.
//  Copyright (c) 2012年 SamPeng. All rights reserved.
//

#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
#include <string.h>

int main(int argc, const char * argv[])
{
    int status,i;
    int cflags = REG_EXTENDED;
    regmatch_t pmatch[1];
    const size_t nmatch=1;
    regex_t reg;
    const char *pattern="\\w";
    char *buf = "sam@sampengw.org";

    regcomp(&reg, pattern, cflags);
    status = regexec(&reg, buf, nmatch, pmatch, 0);

    if(status == REG_NOMATCH)
        printf("No Match \n");
    else if(status == 0){
        printf("Match:\n");
        for (i=pmatch[0].rm_so; i<pmatch[0].rm_eo; ++i) {
            putchar(buf[i]);
        }
        printf("\n");
    }
    regfree(&reg);
    return 0;
}

补充:是的,我知道这项工作是 POSIX Base reg,如何更改?我不想使用强大的正则表达式

4

2 回答 2

1

Glib 正则表达式不支持\通用字符类的通用速记。它确实支持 POSIX 字符类(例如[[:space:]]),因此您可以根据需要使用它。否则,您可以显式使用不带速记的字符集(例如[ \t\n])。

正则表达式手册页中有关于此的非常好的文档。

于 2012-10-20T16:22:30.173 回答
1

glib regex 模块支持POSIX 扩展正则表达式,由于在 1986 年已经标准化,因此它只允许现代正则表达式语法的一小部分。对于像\wand这样的速记类\s,您需要GNU 扩展(在Gnulib中可用)或PCRE图书馆

于 2012-10-20T16:43:54.773 回答