首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在解析给定的字符串:#parameter1~value1#parameter2~value2#parameter3

正在解析给定的字符串:#parameter1~value1#parameter2~value2#parameter3
EN

Stack Overflow用户
提问于 2013-06-19 23:49:43
回答 2查看 71关注 0票数 2

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

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-20 04:47:40

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-06-20 00:16:30

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

代码语言:javascript
复制
param1:value1;param2:value2;param3:value3.....

最好的方法是使用javaStringTokenizer。代码如下所示:

代码语言:javascript
复制
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++计数器部分,strtok函数。有关更多信息,请参阅here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17195703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档