regex_replace返回空字符串:正则表达式错误排查及浮点数转换问题
问题分析与解决
你的正则表达式逻辑完全错误,导致所有字符都被匹配替换为空,最终返回空字符串。
错误原因
原正则\\D|[^+-.]的逻辑是:匹配非数字字符 OR 不是+、-、.的字符。
- 数字字符会被
[^+-.]匹配(因为数字不属于+、-、.) - 非数字字符会被
\\D匹配
等于所有字符都会被命中,替换后自然变成空字符串。
另外还有个细节坑:字符集里的-如果放在中间会被解析为字符范围(比如+-.会被当成从+到.的ASCII区间),会匹配到意外的字符,必须把-放在字符集的开头/结尾,或者用反斜杠转义。
正确写法
你需要匹配的是**不是数字、不是+、不是-、不是.**的字符,用单个字符集就能实现:[^0-9+-.](把-放在最后,避免范围解析问题),或者转义-写成[^0-9+\-.]。
修正后的代码:
#include <iostream> #include <regex> int main() { std::string temporary_recieve_data = " S S +456.789 tg\r\n"; std::string::size_type sz; // 匹配所有不是数字、+、-、.的字符 const std::regex reg_exp("[^0-9+-.]"); std::string numeric_string = std::regex_replace(temporary_recieve_data, reg_exp, ""); std::cout << "Numeric String : " << numeric_string << std::endl; if (numeric_string.empty()) { return 0; } float data_value = std::stof(numeric_string, &sz); std::cout << "Float Value : " << data_value << std::endl; return 0; }
运行后输出:
Numeric String : +456.789 Float Value : 456.789
内容的提问来源于stack exchange,提问作者Dark Sorrow
相关产品推荐
相关产品推荐

