2012-07-11 47 views
0

我很新的正则表达式,我不能让我的功能做我想做的。
我有一个很长的字符串,我想从中提取3个变量。C++正则表达式,解析

我的字符串如下:

Infoname/info : 
Input_Device_Name GTape Buffer_Size 16384 Acquisition_Event_Rate 163691.000000 
Acquisition_Buffer_Rate 14873.333008 Acquisition_Succes_Rate 100.000000 

而我的目标是为163691.000000,14873.333008和100.000000存储在三个型动物的变量。

什么是最快最好的方法呢?

谢谢
EO

+0

阐明您需要的属性。为什么这个令牌 - 因为浮点值? – triclosan 2012-07-11 09:47:12

+0

事实上,我不关心浮点值。如果我只得到[int]部分就没关系。 – eouti 2012-07-11 09:48:55

回答

1

您可以使用下面的正则表达式来寻找它:

"Input_Device_Name\s+GTape\s+Buffer_Size\s+[0-9.]+\s+Acquisition_Event_Rate\s+([0-9.]+)\s+Acquisition_Buffer_Rate\s+([0-9.]+)\s+Acquisition_Succes_Rate\s+([0-9.]+)" 

这应该抓住三个值假设你的文字保持不变,并且您的号码始终采取这种形式(即是积极的,而不是在指数形式)。请注意,只有最后三个数字是通过将括号括起来捕获的。

如果使用正则表达式的提振,你可以做这样的事情:

#include <boost/regex.hpp> 

...

boost::smatch what; 
static const boost::regex pp("Input_Device_Name\\s+GTape\s+Buffer_Size\\s+[0-9.]+\\s+Acquisition_Event_Rate\\s+([0-9.]+)\\s+Acquisition_Buffer_Rate\\s+([0-9.]+)\\s+Acquisition_Succes_Rate\\s+([0-9.]+)"); 
if (boost::regex_match(inputTextString, what, pp)) 
{ 
    if (what.size() == 4) 
    { 
     double d1 = strtod(static_cast<const string&>(what[1]).c_str(), NULL, 0); 
     double d2 = strtod(static_cast<const string&>(what[2]).c_str(), NULL, 0); 
     double d3 = strtod(static_cast<const string&>(what[3]).c_str(), NULL, 0); 

     // These are your doubles, do some stuff with them. 
    } 
} 

哪里inputTextString包含要解析的文本行,所以如果这是来自一个文件说,你会想把这个代码放在一个循环中。 what变量是所有匹配文本的向量,尽管what[0]包含整行,因此可以忽略,除非您需要它。最后但并非最不重要的一点是,请记住将“空格”字符类加倍转义,否则在呈现给正则表达式处理器之前,它已经被编译器处理(或生成错误或警告)。另外请注意,我没有时间编译它,虽然它是基于工作代码

请注意输入文件的尾部空白,并使用^$标记开头或结尾如果有帮助的话。

+0

为什么不使用boost :: lexical_cast如果使用boost库? – Ixanezis 2012-07-11 11:03:16

+0

@组件10:哪种类型必须是'inputTextString'?我尝试过const char *,char * ...,并且在boost文件中提到了const charT *。我该如何施展它? – eouti 2012-07-11 11:04:23

+0

@eouti [看起来像](http://www.boost.org/doc/libs/1_50_0/libs/regex/doc/html/boost_regex/ref/regex_match.html)它可能是一个指向null终止的指针字符串,或一个std :: string :) – Ixanezis 2012-07-11 11:10:04

0

只要它返回任何结果只要搜索[0-9\.]+。例如,如果您想拒绝16384作为您不需要的变量,请测试每个搜索结果中是否有点。