2016-02-24 114 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%的准确结果。我想我会没事的。 –

相关问题