11
13

Regular expression-跟brainfuck差不多的東西

最近好像有點流行短碼或符號語言之類的程式寫法,市面上也出了幾本書,brainfuck也是符號語言的代表之一,看完wiki上的brainfuck程式,我真他x的想吐血,我不曉得工作上交接這種東西會有誰願意,小弟最近也是陷入類似brain fuck的regular expression地獄,regular expression又臭又長就算了,連GNU的regex library也這麼的不堪用,一些簡單的case也無法處理

小弟一開始先拿unsigned integer去試GNU regex library,範例如下,unsigned的regular expression可以在Regular expression library找到,其表達示為” ^\d*$”

int regGNUunsigned(char *num)
{
regex_t preg;
char errbuf[256];
int errcode;
 
char *regex="^\\d*$";
 
memset(&preg,0,sizeof(regex_t));
 
if ((errcode=regcomp(&preg,regex,REG_EXTENDED|REG_NOSUB))==0)
{
if ((errcode=regexec(&preg,num,0,NULL,0))==0)
{
regfree(&preg);
return OK;
}
else
{
regerror(errcode,&preg,errbuf,sizeof(errbuf));
printf("[GNU lib]%s\n",errbuf);
regfree(&preg);
return FAIL;
}
}
else
{
regerror(errcode,&preg,errbuf,sizeof(errbuf));
printf("[GNU lib]%s\n",errbuf);
return FAIL;
}
}

嘗試的結果就是一直都有問題,不曉得為什麼regexec只report error給我,一開始以為是regular expression表達示的問題,可是後來嘗試其它軟體去try這個表達示,發現沒問題阿

後來又去找找看有沒有其它的regular expression library,還好,總算找到PCRE,同樣的表達示我用PCRE一試就過,範例如下

int regPCREunsigned(char *num)
{
char *pattern ="^\\d*$";
const char *error;
int nError;
pcre *mypcre;
int ret=FAIL;
 
mypcre = pcre_compile(pattern, 0, &error, &nError, NULL);
ret = pcre_exec(mypcre, NULL, num, strlen(num), 0, 0,NULL, 0);
if (ret>=0) return OK;
else return ret;
}

為了這鳥問題我花了整整一天的冤枉路,在那邊東調調西調調…….,再怎麼調,regex就是不理我….唉…

標籤: linux
評論: 1 | 引用: 0 | 閱讀: 10833
  • 1 
比尔盖子 [ 2012-11-24 22:59 網址 | 回覆 | 編輯 刪除 ]
虽说<regex.h>是 POSIX 的标准,但是功能极差,连UTF8都不支持。
PCRE 是非常强大的 Library,Python、PHP、Perl都在用,你找对了。
  • 1 
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: