【问题标题】:C++ regex_replace to clean concatenated decimal numbersC++ regex_replace 清理连接的十进制数
【发布时间】:2019-10-19 20:25:39
【问题描述】:

作为清理 SVG 路径数据字符串以供显示的一部分,我想在连接的小数之间添加空格。

一个例子是“0.1.20”应该变成“0.1 .20” - 当你有2个小数点仅由一个或多个小数分隔时,基本上在第二个小数点之前添加一个空格(即“2.0”不应该变成“2 .0”)

我尝试了以下方法:

#include <iostream>
#include <regex>
#include <string>

void splitString(std::string& pathString) {

  // ... some other clean-up, which works ...

  std::regex re3("(\\.[:digit:]+)(\\.)");$
  pathString = std::regex_replace(pathString, re3, "$1 $2");$

  std::cout << pathString << std::endl;$
}

但是当我传入一个带有连接小数的字符串时,比如

M 46 -38.9 q 3.7.15 7.65.45 1.2.1 2.35.25 2.75.3 5.05.85 3.85.9 6.5 2.4

它在 cout 日志行上没有改变。我正在使用类似的正则表达式来清理字符串的其他元素并且它们都可以正常工作,所以我假设它与正则表达式本身直接相关。

【问题讨论】:

    标签: c++ regex character-class


    【解决方案1】:

    又试了几样,找到了一个行得通的。

    在 [:digit:] 周围添加一个字符类解决了这个问题。

    std::regex re3("(\\.[[:digit:]]+)(\\.)");
    

    [:digit:] 显然是一个类范围,它必须包装在一个字符类中才能被解析为原子。

    【讨论】:

    • 如果您想添加对此答案的引用:en.cppreference.com/w/cpp/regex/ecmascript#Character_classes
    • 好主意!但无论如何它都不能正常工作,对吧?我的意思是,5.05.85 应该转换为 5.0 5.85 而不是 5.05 .85?
    • @anatolyg 不,the SVG spec 指定贪心匹配,所以尽可能多的数字到第一个数字; 5.05.85 应解释为 5.05 后跟 .85
    • @JaMiT 我不确定这是否是您要发布的链接(您的意思是这样的答案吗?)。我仍然有点困惑,为什么不能将 POSIX 字符范围视为原子,TBH。
    • @patros 嗯......也许你在我的第一条评论中误读了“这个答案”?当我说“这个答案”时,我的意思是我正在评论的答案(即你的答案right here);我并不是在暗示该链接是指向答案的。链接是参考。 (如果您愿意,我可以发布自己的答案,但我想我会先让您有机会改进您的答案。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2013-04-18
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多