2009-06-23 49 views
3

我想串pcode在符合下列項目:編譯/匹配POSIX正則表達式用C

  • u接着是1或2位數
  • phaseu
  • phasep
  • x(被非字詞包圍)
  • y(被非字詞字符包圍)
  • z(由非文字字符包圍)

我試圖實現使用正則表達式POSIX函數(如下所示)一個正則表達式匹配,但有兩個問題:

  1. 編譯模式似乎沒有子模式(即compiled.n_sub == 0)。
  2. 該模式在字符串「u0」中找不到匹配項,它真的應該這樣做!

我有信心,正則表達式字符串本身正在工作,它在python和TextMate中工作 - 我的問題在於編譯等在C.任何幫助獲得這項工作將非常感激。

在此先感謝您的答案。

if(idata=tb_find(deftb,pdata)){ 
    MESSAGE("Global variable!\n"); 
    char pattern[80] = "((u[0-9]{1,2})|(phaseu)|(phasep)|[\\W]+([xyz])[\\W]+)"; 
    MESSAGE("Pattern = \"%s\"\n",pattern); 
    regex_t compiled; 
    if(regcomp(&compiled, pattern, 0) == 0){ 
     MESSAGE("Compiled regular expression \"%s\".\n", pattern); 
    } 

    int nsub = compiled.re_nsub; 
    MESSAGE("nsub = %d.\n",nsub); 
    regmatch_t matchptr[nsub]; 
    int err; 
    if(err = regexec (&compiled, pcode, nsub, matchptr, 0)){ 
     if(err == REG_NOMATCH){ 
      MESSAGE("Regular expression did not match.\n"); 
     }else if(err == REG_ESPACE){ 
      MESSAGE("Ran out of memory.\n"); 
     } 
    } 
    regfree(&compiled); 
} 

回答

14

看來你打算使用類似於「擴展」的POSIX正則表達式語法。 POSIX定義了兩種不同的正則表達式語法,即「基本」(讀取「過時」)語法和「擴展」語法。要使用擴展語法,您需要添加REG_EXTENDED標誌regcomp

... 
if(regcomp(&compiled, pattern, REG_EXTENDED) == 0){ 
... 

沒有這個標誌,regcomp將使用「基本」正則表達式語法。有一些重要的差別,如:

  • |操作
  • 的子匹配的支架需要不支持轉義,\(\)

還應該指出的是,的POSIX擴展正則表達式語法與Python的正則表達式(不知道TextMate)是否1:1兼容。具體而言,恐怕你的正則表達式的這部分不POSIX工作,或者至少是不可移植的:

[\\W] 

POSIX的方式來指定非空格字符是:

[^[:space:]] 

你的整個POSIX正則表達式應該看起來像C:

char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)"; 
+0

感謝威樂!這個技巧非常漂亮。 你能告訴我是否有OR(|)的等價物,還是我應該只編譯和匹配多個表達式? – 2009-06-23 12:06:29