2011-06-14 74 views
1

我試圖用regex.h匹配一個字符串「123,1234」。以下模式做的工作:正則表達式C

"^[0-9]\{1,\},[0-9]\{1,\}$" 

如果我把它作爲命令行參數它工作正常。但是當我在C代碼中使用它時不起作用。可能是因爲將反斜線標識爲轉義字符。

示例代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <regex.h> 

int main (int argc, char * argv[]){ 
    regex_t regex; 
    int reti; 
    char msgbuf[100]; 
    char * string, * pattern; 

    string = "123,1234"; 
    pattern = "^[0-9]\{1,\},[0-9]\{1,\}$"; 

    if(regcomp(&regex, pattern, 0)) 
    { 
      fprintf(stderr, "Could not compile regex\n"); 
      exit(107); 
    } 

    if(!(reti = regexec(&regex, string, 0, NULL, 0))) 
    { 
      printf("MATCH\n"); 
    } 
    else if(reti == REG_NOMATCH) 
    { 
      printf("NO MATCH\n"); 
    } 
    else 
    { 
      regerror(reti, &regex, msgbuf, sizeof(msgbuf)); 
      fprintf(stderr, "Regex match failed: %s\n", msgbuf); 
      exit(107); 
    } 

    regfree(&regex); 

    return 0; 
} 

我怎樣才能解決這個問題?

+0

很難通過一個樣本來判斷,但模式看起來太複雜了,不是嗎? '^ \ d +,\ d + $' – Regexident 2011-06-14 16:21:22

+0

@Regexident'+'既不能在grep中使用也不能使用regex.h – drox 2011-06-14 16:27:05

+0

@Regexident我從這裏找到它[link](http://www.robelle.com/smugbook/regexpr。 HTML)它在grep中工作,以及如果我們將它作爲命令行參數傳遞給程序。 – drox 2011-06-14 16:33:08

回答

3

您的正則表達式是ERE而不是BRE,所以您需要將REG_EXTENDED標誌傳遞給regcomp。然後,正如其他人所說,也要去掉反斜槓。

+0

它工作!太感謝了! – drox 2011-06-14 16:41:22

1

如果斜槓被當作轉義字符對待,你有沒有嘗試將斜線加倍,以便將它們視爲斜線?

"^[0-9]\\{1,\\},[0-9]\\{1,\\}$" 
+0

是的,我也嘗試過。 – drox 2011-06-14 16:18:46

+1

@Dulanja:這一個實際上爲我工作一分鐘前。這個,以及**沒有**任何反斜槓,但** REG.EXTENDED被設置爲'regcomp()'中的標誌,如R ..的答案所示。 – Regexident 2011-06-14 16:42:46

+0

是的我錯過了'REG_EXTENDED'。現在它可以工作。我應該早些發佈示例代碼。謝謝:) – drox 2011-06-14 16:45:39

2

要覆蓋斜線作爲轉義序列,在C一個使用斜線逃脫一斜線,所以\變得\\

但是,由於您沒有將字符串傳遞到命令行,所以大括號{}不會被shell的解析器捕獲,因此您可以在沒有所有斜線的情況下嘗試。

"^[0-9]{1,},[0-9]{1,}$" 
+0

我試過了,但它不適合我。 – drox 2011-06-14 16:35:57

3

^[0-9]{1,},[0-9]{1,}$ 取出\反斜槓。他們隨即逃離角色。