2016-09-08 29 views
1

这是我第一次在C中使用正则表达式,并且遇到了一些麻烦。我试图复制在sed中使用的语法,即s/findthisstring/replacewiththis/g,其中findthisstring必须存在,并且replacewiththis不存在。Posix正则表达式不能在C中工​​作

我想出了正则表达式是^s/(.*)/(.*)/g$

这是在我的代码

int verifyPattern(char *pattern) { 
    regex_t regex; 
    int reti = regcomp(&regex, "^s/(.*)/(.*)/g$", 0); 

    if (reti) { 
     fprintf(stderr, "Could not compile regex\n"); 
     exit(1); 
    } 

    reti = regexec(&regex, pattern, 0, NULL, 0); 
    if (!reti) { 
     puts("Match"); 
    } else if (reti == REG_NOMATCH) { 
     puts("No match"); 
    } else { 
     puts("Regex error"); 
    } 

    return 1; 
} 

我相信是搞乱的部分是.+。如果我用.*替换它,一切都很好。任何人都知道这个工作?

谢谢!

+0

请提供一个测试用例来证明什么行不通。 –

+0

你为什么要逃避正则表达式中的正斜杠。 '/'不是任何正则表达式引擎中的元字符。另外,找到嵌入的正则表达式并不是那么简单,除非你知道如何解析正则表达式。 – sln

+0

尝试'const char * str_regex =“^ s /((\\\\。| [^ \\\\\ /] +)/)。(*)/ g $”;' –

回答

1

您忘记了通过REG_EXTENDED标志来允许$在模式中。此外,你的正则表达式将允许太多的/.../部分。你需要的是要匹配的转义序列或大于/\以外的字符:基本上

int reti = regcomp(&regex, "^s/(\\\\.|[^\\\\/]+)+/(\\\\.|[^\\\\/]+)*/g$", REG_EXTENDED); 

C demo

,我换成.(\\.|[^\\/]+)模式匹配任何一个转义序列(\\.)或(|)除\/以外的一个或多个字符。

下面是测试列表:

verifyPattern("s/s/s/g");//Match 
verifyPattern("s/s//g");//Match 
verifyPattern("s//s/g");//No Match 
verifyPattern("s/s\\/s/g");//No match 
verifyPattern("s/s\\/s/text/text/text/g"); // No match