0

我对正则表达式很陌生,我无法让我的函数做我想做的事。
我有一个长字符串,我想从中提取 3 个变量。

我的字符串看起来:

 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 存储在三个不同的变量中。

请问最快最好的方法是什么?

谢谢你,

4

2 回答 2

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.]+)"

假设您的文本保持不变并且您的数字始终采用这种形式(即是正数而不是指数形式),这应该捕获三个值。请注意,只有最后三个数字通过将括号括在它们周围来捕获。

如果你使用 boost 正则表达式,你可以这样做:

#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.
    }
}

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

注意输入文件中的尾随、前导空格,如果有帮助,请使用^and$分别标记行的开头或结尾。

于 2012-07-11T10:06:35.190 回答
0

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

于 2012-07-11T09:46:01.977 回答