在日常生活中,經常有大量的文本需要處理,正則表達式正是基于此提出的。本文將結合一些具體的實例來解釋它。雖然在不同的語言環境中,正則表達式有不同的語法規則,但其基本語義卻是一致的。http://en.wikipedia.org/wiki/Regular_expression。這將是一個系列教程。本節只是一個開胃菜:)
某一次同學很無聊,然后問我電腦上有無小說。這是顯然的,我是網絡小說迷嘛!從起點down下無數小說存在電腦上,名字都懶得改,都是以數字打頭,然后以“.txt”結尾,比如23432.txt之類的。當然,文件查找還是得用Everything,要不然電腦上的上百萬個文件,手會抽筋的。
(注:我以為Everything是史上最快的文件查找工具,強烈推薦!)
先用"*.txt"嘗試一下,:(,給出一大堆文本文件呀。范圍太廣。還是得用正則表達式來。
^[0-9]*\.txt
Yes!給出了我電腦上存儲的所有小說了。
解釋一下:
^[0-9]表示文件名以0-9之間的數字開頭,^是開頭的意思($結尾)
*表示它前面的字符(這里是數字)要重復若干次(>=0)
\.匹配139869.txt中的那個小數點。因為正則表達式中,‘.’被占用了,表示任意字符,所以要轉義一下
txt,這就不說了,緊接著小數點的是‘txt’三個字符。
Everything只支持部分正則表達式, | () ? * + . [] [^] ^ $ {m,n} 不過已經完全夠用了。
http://xbeta.info/everything/faq.htm#How_do_I_use_regex
考慮這樣一個問題:項目組在驗收的時候,被指出代碼的注釋量不夠,需要達到至少30%才行,也就是至少需要添加6500行注釋。此時老師提出,要將所有的函數加上注釋,函數的名稱、功能、參數、返回值。這個時候,考慮能不能用正則表達式,提取源代碼中的函數信息,然后自動生成注釋模板?比如:
int foo(int x, int y);
替換為:
/**
* @method foo
* @para x
* @para y
* @return
*/
int foo(int x, int y);
注意到,這個函數參數的個數和類型可以是變動的,返回值限定符的個數和類型也是變動的,比如static類型函數,有兩個限定符,而構造函數,則沒有限定符,還有部分virtual類型函數。