用括号解析C ++中的字符串

时间:2019-04-11 09:09:09

标签: c++

我必须在C ++中解析字符串以获取双精度。 字符串的格式类似于[(a,b)-(c,d)],其中a,b,c和d将是双精度变量。

我试图使用stringstrem,但是它不接受const char参数,所以我现在不知道如何解决它。

我现在的代码如下:

ss >> "[(" >> a >> "," >> b >> ")-(" >> c >> "," >> d >> ")]";

可惜的是它不起作用:(

例如:[(1.2,3.4)-(6.5,7.4)]。 我想要:

  a=1.2;
  b=3.4;
  c=6.5;
  d=7.4;

3 个答案:

答案 0 :(得分:6)

对于输入流,您需要读取输入到变量。您可以读入char或读入std::istream::read的字符串。理想情况下,您应该检查字符是否确实符合预期,以捕获并可能拒绝说出__1.2-3.4@#~6.5,7.8++

char chr;
ss >> chr >> chr >> a >> chr >> b >> chr >> chr >> chr >> c >> chr >> d >> chr >> chr;

或者,您可以将其读取为字符串,然后可以使用C ++ <regex>功能对其进行匹配,例如:

^\[\((\d+\.\d+),(\d+\.\d+)\)-\((\d+\.\d+),(\d+\.\d+)\)\]$

这将为您提供4个成功的捕获组,然后您可以将其转换为双打。例如,如果允许多余的空格,小数点是可选的,等等,您可以进行修改。

如果格式有任何变化,例如有时您会得到3个数字,例如[(1.2,3.4)-(6.5,7.4)+(1.5,2)]>>操作员可以直接支持的深度解析更多。

可能可以使用基于ss >> chr所读内容的逻辑,或者通过根据上一个匹配项的结束位置(而不是一次匹配整个字符串)循环查找正则表达式,尽管事情会变得更加先进。

答案 1 :(得分:1)

这并不是解决问题的最优雅的方法,但它是人类可以阅读和维护并可能在以后轻松扩展的一种方法...我宁愿使用它而不是正则表达式:-)

        auto input = "[(1.0,2.0)-(3.0,444.555)]";
        std::string in(input);
        for (auto iter = in.begin(); iter < in.end(); iter++)
        {
          char c = *iter;
          // If c == '(' or ',' parse a double number (digits or '.')
          // and save it somewhere. 

          // else: stop parsing a number / continue
        }

答案 2 :(得分:1)

老实说,这是C库仍然拥有最佳工作工具的时候之一:

columns.push({
                xtype: 'actioncolumn',
                width: 35,
                dataIndex: 'objType',
                renderer: function (value, rowIndex, record) {
                    if (value == 'object') {
                        rowIndex.tdCls = 'icon'
                    }
                    else{
                        rowIndex.tdCls = 'img'
                    }
                },
                items: [{
                    tooltip: t('icon_compare_version'),
                    icon: "/bundles/pimcoreadmin/img/flat-color-icons/info.svg",
                    handler: this.compareVersion.bind(this),
                    iconCls: 'compare-v'
                },
                {
                    tooltip: t('icon_compare_image_version'),
                    id:'compare-i',
                    icon: "/bundles/pimcoreadmin/img/flat-color-icons/picture.svg",
                    handler: this.compareImageVersion.bind(this),
                    iconCls: 'compare-i'
                }]
            });

live demo

IOStreams可以做到(如Fire Lancer所示),但是稍稍冗长,并且您可以自己滚动(如Ozzy所示),但是为什么要花那么多精力呢?

还有大量的 Boost.Spirit 怪兽可以以“现代”方式实现这一目标,而获得的收益却很小。

这真的是一站式解决的问题。