2016-02-24 156 views
3

我必須從各種C++函數調用中提取函數名稱。以下是一些函數調用示例和高亮顯示的提取函數名稱。正則表達式從C++函數調用中提取函數

  • std::basic_fstream<char,std::char_traits<char> >::~basic_fstream<char,std::char_traits<char> > 〜basic_fstream的
  • CSocket::Send發送
  • CMap<unsigned int,unsigned int &,tagLAUNCHOBJECT,tagLAUNCHOBJECT &>::RemoveAll Cerner::Foundations::String::Rep::~Rep〜衆議員

  • CCMessage::~CCMessage〜CCMessage

  • std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,u _Tree
  • Lib::DispatcherCache::~DispatcherCache〜DispatcherCache
  • CPrefDataObjectLoader<CPrefManagerKey,CPrefManagerValue,CGetPrefManager,PrefManagerKeyFunctor>::Get獲取

    以下正則表達式適用於大多數的功能

  • /((?:[^:]*))$';/此正則表達式從最後得到的字符串:
  • /+?(?=<)';/這一個刪除以<
開始串

但是對於std::basic_fstream<char,std::char_traits<char> >::~basic_fstream<char,std::char_traits<char> >我得到的輸出是char_traits,因爲這個字符串在最後':'後面,但結果應該是是~basic_fstream。有沒有一種方法可以將這兩個正則表達式組合起來並忽略在<>之內的所有內容?

+0

選擇在線工具以幫助您達到目的地: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=online%20regex%20builder –

+0

@KenWite看起來像一個要求從源代碼解析出函數名的人。這裏我的問題更加複雜。我需要從不同的函數調用中解析函數名稱。 –

回答

3

C++語法不僅不規則,而且實際上對上下文敏感(尤其是近模板)。即使是一個合適的CFG解析器也不會幫助你,更不用說一個普通的舊正則表達式了......與其試圖用醜陋而脆弱的黑客來逼近不可能的東西,爲什麼不使用實際的工具來完成這項工作?如果你想解析C++,那麼使用C++解析器,比如libclang

+0

我認爲沒有簡單的方法。不過,我不想使用解析器,因爲它是一個複雜問題的簡單項目。我使用的正則表達式給我90%的準確結果。我想我會沒事的。 –

相關問題