boost正則庫匹配ANSII編碼的中文、全角字符示例

 ===================================

本人log中所有未註明轉載的文章和blog一般爲本人原創或整理加工,
原創文章版權本人(lonefox)所有;轉載文章版權歸原作者所有;

http://blog.csdn.net/boythl

歡迎轉載,但請註明出處,保留作者和版權信息。

===================================

   首先,boost正則庫(regex)不支持形如 [0-9] (注意:這個0和9是全角字符。)這樣的表達式,貌似會崩潰。

 

   現在查網上正則匹配中文的例子,都是講用 /uFF00-/uFFFF ; 拜託,/u是unicode編碼,能用於我常用的ansii編碼(如GB18030,GBK,GB2312等等)嗎?舉例時也不說清楚。

 

   再次查看正則語法,發現 /xnn 比較有用,/x匹配ASCII編碼中十六進制代碼爲nn的字符,注意,是單個字符,因此,對於雙字節的全角,我們需要用兩個/x才能匹配一個全角字符。舉例如下(下文示例全部使用ANSII編碼,GB2312或GB18030):

 

   全角數字:0123456789 (/xA3[/xB0-/xB9])+ , 0是/xA3/xB0

   全角小寫字母:az (/xA3[/xE1-/xFA])+, a是/xA3/xE1 z是/xA3/xFA

   全角大寫字母:AZ (/xA3[/xC1-/xDA])+ ,A是/xA3/xC1 Z是/xA3/xDA

 

    其他漢字也類似,有需要的可以自己查查編碼。 不知道漢字對應的ANSII編碼?使用UltraEdit32,輸入漢字後按CTRL+H,就可以看到16進制的編碼。

 

   下面貢獻一個我自己項目時臨時寫的測試正則表達式的小工具。 只提供簡單的測試表達式是否匹配文本的功能。使用自己封裝的boost::regex庫完成,該庫是爲了擺脫boost和stlport同時使用時的編譯問題而編寫。靜態鏈接regex庫,因此發佈時不需要boost庫,以後不用再異常辛苦的編譯boost庫了。

   小測試工具下載地址:https://p-blog.csdn.net/images/p_blog_csdn_net/boythl/EntryImages/20081121/boostRegex.jpg  下載後請將擴展名修改爲RAR。

   工具代碼也十分簡單:

  1. void CMy4Dlg::OnButton1() 
  2. {
  3.     UpdateData();
  4.     NAVINFO::CMatch match;
  5.     NAVINFO::CRegex reg(this->m_strExpression);  //使用默認參數normal,因此表達式是區分大小寫的
  6.     if (reg.regex_match(this->m_strText, match))//使用默認參數normal
  7.     {       
  8.         CString str = _T("");
  9.         str.Format("共有匹配項 %d 個:", match.size());
  10.         this->m_strResult = str;
  11.         for (int i = 0; i < match.size(); i++)
  12.         {
  13.             str.Format("/r/n%02d:%s", i, match[i]);
  14.             this->m_strResult += str;
  15.         }
  16.         UpdateData(FALSE);
  17.     }
  18.     else
  19.     {
  20.         MessageBox("Unmatch");
  21.     }
  22. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章