2011-11-07 26 views
12

我已經看過POSIX正則表達式庫和PCRE庫中的正則表達式函數,但它們似乎都沒有字符串替換函數。我不想使用C++,如果我不需要鏈接另一個庫(但我可以,如果必須的話)將是最好的。我是否需要手動進行字符串替換?如果是這樣,我如何使用捕獲組?如何在純C中執行regex字符串替換?

+0

你指的是什麼捕獲組?正則表達式沒有內置的C庫,你將不得不使用pcre或者像這樣的somithing。 – lvella

+0

一般而言,您不能在C字符串內進行字符串替換 - 您可能沒有可用的內存。你能澄清你到底想要做什麼嗎? –

+0

所以你想讓我具體嗎?我有一個HTTP請求頭,我想使用正則表達式來更改並轉發到服務器。 – Yifan

回答

20

regex.h不提供對字符串替換的本機支持,但它確實提供了使表達更容易的子表達式/捕獲組。我假設你熟悉正則表達式編譯並跳到正則表達式執行和子表達式。

regexec()被定義爲在regex.h如下(在/ usr /包括/):

extern int regexec (const regex_t *__restrict __preg, 
     const char *__restrict __string, size_t __nmatch, 
     regmatch_t __pmatch[__restrict_arr], 
     int __eflags); 

第一,第二和最後的參數是正則表達式,要在與執行的標誌執行的字符串, 分別。第三個和第四個參數用於指定regmatch_t的數組。 regmatch_t由兩個字段組成:rm_so和rm_eo,它們分別是匹配區域開始和結束的索引或偏移量。然後可以將這些索引與string.h中的memcpy(),memset()memmove()一起使用以執行字符串替換。

我會舉一個小例子,稍後發佈。

祝你好運,我希望這有助於。

+0

+1這樣的答案,你應該有超過308代表! –

+4

*我會舉一個小例子,稍後發佈。*什麼時候?你在5年前做出了這個承諾。 ;([Here are](http://stackoverflow.com/questions/1085083/regular-expressions-in-c-examples)我發現迄今爲止的幾個例子 –

5

PCRE庫本身不提供替換功能,但在PCRE下載頁面有一個包裝函數,它接受perl風格=~ s/pattern/replace/語法,然後使用PCRE本機函數爲您替換/替換。轉至http://www.pcre.org/,然後點擊下載鏈接:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/,然後點擊Contrib目錄。你想要的包/項目是:pcrs-0.0.3-src.tar.gz

請注意,我沒有使用這個我自己,所以我不能證明它的工作效果。這是一段相當小而簡單的代碼,因此它可以很好地爲您的目的服務。

+0

嗨,感謝您的鏈接。在我的程序中使用pcrs?我目前使用pcre_compile和pcre_exec函數,如http://stackoverflow.com/a/1421923/1729501 – user13107