直接用正则\d匹配并替换所有非数字字符可得纯数字;但处理浮点数或负数时需用更精准模式如-?\d+\.?\d*提取合法数值子串。

直接用正则表达式匹配并替换掉所有非数字字符,保留纯数字即可。
使用 \D 匹配所有非数字字符
\D 是 \d 的反向匹配,等价于 [^0-9],能匹配任意一个非数字字符(包括字母、空格、标点、制表符、换行符等)。
- 在 JavaScript 中:
"abc123def45".replace(/\D/g, "")→"12345" - 在 Python 中:
re.sub(r'\D', '', 'price: ¥299.99')→"29999" - 注意必须加全局标志 g(JS)或使用 sub(Python),否则只替换第一个匹配项
处理带小数点或负号的数字(如 -12.34)
如果原始字符串含合法浮点数或负数,单纯删非数字会破坏结构(例如 "-12.34" 变成 "1234")。此时需更精准匹配:
- 提取所有数字子串(含小数点和负号):
-?\d+\.?\d*,再拼接或取首个 - 例如 Python:
''.join(re.findall(r'-?\d+\.?\d*', '温度:-23.5℃'))→"-23.5" - 若只要整数部分,可先提取再转 int,或用
r'(? 避免匹配小数中间的数字
注意中文数字和全角字符
\D 默认不识别全角数字(如“123”)和中文数字(如“一、二”),它们会被当作非数字删掉。
- 若需兼容全角数字,可扩展字符类:
[^\d\uFF10-\uFF19](\uFF10–\uFF19 是全角 0–9) - 中文数字需单独处理,正则无法直接转换,建议先用映射表替换为阿拉伯数字,再清理
- 常见误判:Unicode 符号如 ①、❷ 属于符号类,不在 \d 范围内,也会被清除
实际应用中的小技巧
避免过度清理导致意外丢失信息,比如电话号码中的短横线或括号有时需保留。
- 只清理特定位置:用
/(? 类似逻辑定位干扰字符 - 保留分隔符:如手机号
"138-1234-5678",想留短横线就改用/[^\d-]/g - 提前 trim() 或 strip() 再处理,避免首尾空格干扰结果











