在C ++ STL中,如何使用regex_replace从std :: string中删除非数字字符?

问题描述 投票:1回答:3

使用C ++标准模板库函数regex_replace(),如何从std::string中删除非数字字符并返回std::string

这个问题不是question 747735的重复,因为该问题请求如何使用TR1 / regex,并且我正在请求如何使用标准STL正则表达式,并且因为给出的答案仅仅是一些非常复杂的文档链接。在我看来,C ++正则表达式文档非常难以理解,文档记录很少,所以即使有问题指出standard C++ regex_replace documentation,它对新编码器仍然没有用。

c++ regex replace stl
3个回答
3
投票

正则表达式在这里是过度的。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>

inline bool not_digit(char ch) {
    return '0' <= ch && ch <= '9';
}

std::string remove_non_digits(const std::string& input) {
    std::string result;
    std::copy_if(input.begin(), input.end(),
        std::back_inserter(result),
        not_digit);
    return result;
}

int main() {
    std::string input = "1a2b3c";
    std::string result = remove_non_digits(input);
    std::cout << "Original: " << input << '\n';
    std::cout << "Filtered: " << result << '\n';
    return 0;
}

3
投票
// assume #include <regex> and <string>
std::string sInput = R"(AA #-0233 338982-FFB /ADR1 2)";
std::string sOutput = std::regex_replace(sInput, std::regex(R"([\D])"), "");
// sOutput now contains only numbers

请注意,R"..."部分表示原始字符串文字,不会像C或C ++字符串那样计算转义码。这在执行正则表达式时非常重要,可以让您的生活更轻松。

这里有一个方便的单字符正则表达式原始文字字符串列表,供你的std::regex()用于替换场景:

  • R"([^A-Za-z0-9])"R"([^A-Za-z\d])" =选择非字母和非数字
  • R"([A-Za-z0-9])"R"([A-Za-z\d])" =选择字母数字
  • R"([0-9])"R"([\d])" =选择数字
  • R"([^0-9])"R"([^\d])"R"([\D])" =选择非数字

0
投票

如果给定样本的细节很好,则接受的答案。但是对于像“-12.34”这样的数字它会失败(它会导致“1234”)。 (注意样本如何为负数)

那么正则表达式应该是:

 (-|\+)?(\d)+(.(\d)+)*

解释:(可选(“ - ”或“+”))与(一个数字,重复1到n次)与(可选地结束:(a“。”后​​跟(一个数字,重复1到n次))

有点过头了,但是我一直在寻找这个,而且我的搜索中首先出现了这个页面,所以我为未来的搜索添加了答案。

© www.soinside.com 2019 - 2024. All rights reserved.