解析字符串由:#parameter1~value1#parameter2~value2#parameter3

时间:2013-06-19 15:49:43

标签: c++ regex parsing

有人能给我一些提示,说明从可变长度输入字符串中提取参数名称和参数值的最佳/优雅方法是什么?我需要提取这些值,以便将它们写在另一个.txt文件中。我应该使用正则表达式吗?使用它们的方法是什么?

我知道如何做到这一点,但使用for循环和各种if-then条件,这是一个烂摊子。我需要的是在哪里寻找可以帮助我的一些内置函数。

谢谢!

2 个答案:

答案 0 :(得分:1)

在这种情况下,正则表达式是不必要的开销。单个字符std::string::find足以完成这项工作。假设每个参数(甚至是第一个)以#开头,则该值是可选的(默认为""),并且始终省略尾随#,您可以执行以下操作:

std::string pstr = ...; // the parameter string

typedef std::pair<std::string, std::string> Param;
std::vector<Param> params;

std::size_t pos = pstr.find('#');
std::size_t next = pstr.find('#', pos);

while (pos != std::string::npos) {
    std::string param, value;

    std::size_t sep_pos = pstr.find('~', next);
    if (sep_pos != std::string::npos) {
        value = pstr.substr(sep_pos + 1, next - sep_pos - 1);
        param = pstr.substr(pos + 1, sep_pos - pos - 1);
    } else {
        param = pstr.substr(pos + 1, next - pos - 1);
    }
    params.push_back(Param(param, value));
}

注意,std::strtok是一个不好的建议。该函数不安全,不应该在普通的C ++代码中使用。

答案 1 :(得分:0)

假设存储的初始文本如下:

param1:value1;param2:value2;param3:value3.....

最好的方法是使用StringTokenizer的{​​{1}}。 代码如下:

java

另一方面,如果你想在StringTokenizer sT=new StringTokenizer(InputString, ";"); while(sT.hasMoreTokens()) { String Pair=sT.nextToken(); String sT2=new StringTokenizer(Pair, ":"); String param=sT2.nextToken(); String value=sT2.nextToken(); System.out.println(param+" "+value); } 严格编码,那么你可以使用c ++计数器部分, C++功能。有关详情,请参阅here