2011-04-20 72 views
1

我正在嘗試C RegEx庫。這是我爲測試示例模式和字符串而編寫的代碼。但是,這隻能打印出每個字符串的單個模式。例如,在這種情況下,當我運行代碼時,它只打印出「asd f g」。它不識別「xty y z」。 我的代碼有什麼問題,或者我對圖書館的工作原理有一些基本的錯誤。任何和所有的幫助,將不勝感激。C Reg Ex庫代碼幫助

int main(int argc, char **argv) 
{ 
    regmatch_t arr[10]; 
    regex_t *reg=malloc(sizeof(regex_t)); 
    char *str="\t\t asd f g \t =\t\t xty y z \t \t"; 

    if(regcomp(reg,"[a-z][a-z ]*",REG_EXTENDED | REG_NEWLINE)) 
     printf("Unsuccessful Compilation\n"); 
    int i,j; 
    int status=regexec(reg,str,10,arr,0); 
    if(status) 
    { 
     printf("Match Not Found\n"); 
     return; 
    } 
    else 
     printf("Match found\n"); 

    for(i=0;i<10;i++) 
    { 
     if(arr[i].rm_so!=-1) 
      { 
       j=arr[i].rm_so; 
       printf(":"); 
       while(j<arr[i].rm_eo) 
       { 
        printf("%c",str[j]); 
        j++; 
       } 
       printf(":\nNewline\n"); 
      } 
    } 
    return 0; 
} 
+0

我相信regexec必須多次調用,基本上它會停止在第一場比賽。 – ColWhi 2011-04-20 08:32:47

+0

另外你需要在正則表達式上使用regfree()來避免內存泄漏。 – ColWhi 2011-04-20 08:38:53

+1

@Sasquiha - 是的,多次調用regexec應該可以做到。雖然像Henno Brandsma在他的回答中提到,但我必須首次使用regexec匹配字符串,然後使用先前的rm_eo在上一個匹配的最後一個字符後修剪字符串,然後再次調用regexec,直到沒有更多的字符串留下或不再有匹配。 – Sandman 2011-04-20 10:35:33

回答

1

我想你誤解了arr的功能。 arr[0]包含匹配項,並且arr[1]及之後將包含您匹配的子表達式的匹配(括號內的匹配項)。 regexec只會匹配一次,您需要在循環中重複它,繼續,而regexec匹配0,例如,並開始下一場比前一場比賽的rm_so更遠的比賽。 然後您只需要arr數組中的一個元素,因爲您沒有嵌套的表達式。

但是,例如,如果你想匹配等號兩邊,你可以使用正則表達式([a-z][a-z ]*).*=.*([a-z][a-z ]*),然後匹配arr[0]將是一個描述整個匹配的結構,並且描述在=號之前的那個和arr[2]之後的一個(括號內的子表達)。所以,如果你只想匹配行,你可以有效地使用子表達式。

+0

@Henno Brandsma-感謝那個美好的回答。我想我需要提高對正則表達式如何匹配的理解。有關該主題的任何鏈接或書籍?你的答案的第一段,_regcompcomp匹配0_ - 你的意思是regexec對嗎?另外,比rm更遠 - 我想應該是rm_eo?在閱讀你的答案後,我進一步探討了這些數據結構是如何填充的。遇到這個鏈接,這解釋了錯綜複雜的[Using Registers](http://docs.freebsd.org/info/regex/regex.info.Using_Registers.html)。再次感謝您的回答! – Sandman 2011-04-20 10:30:24

+0

是的,regexec的確如此。我會解決它。有一本O'Reilly書(掌握正則表達式)可能很有用,但它更傾向於Perl/Python等,但也包含許多常規信息。 – 2011-04-20 10:33:25

+0

@Henno Brandsma - 請在我的原帖中查看我對Sasquiha的評論。我希望這就是你在答案第一段中的意思。您在2ns段中提到的替代方案實際上對我來說會更好。我不知道可以這樣做。 – Sandman 2011-04-20 10:38:09