如何不使用正则表达式从字符串中提取数字?
不使用正则提取字符串内所有数字的实现方案
给定测试场景:
- 待处理字符串:
userVariable = "someTextWithNumbers432andTextwith331" - 预期提取结果:
[432, 331]
不能使用正则的前提下,可落地的实现方法如下:
- 逐字符遍历缓存法
这是兼容性最强的通用方案,不依赖任何语言专属的高级函数,只要是支持字符串遍历的编程语言都能实现:- 先初始化一个空列表存最终提取结果,再初始化一个空字符串当临时缓存,用来存储连续碰到的数字
- 逐个遍历字符串里的每一个字符
- 如果当前字符是数字,就追加到临时缓存里
- 如果当前字符不是数字,就检查临时缓存:如果缓存里有内容,就把缓存的字符串转成整数存入结果列表,随后清空缓存
- 整个字符串遍历完成后,必须再检查一次临时缓存——不然如果字符串末尾是数字,这部分内容会被漏掉
参考Python实现代码:
userVariable = "someTextWithNumbers432andTextwith331" result = [] temp_cache = "" for char in userVariable: # 直接通过字符顺序判断是否为数字,底层利用了数字字符编码连续的特性 if '0' <= char <= '9': temp_cache += char else: if temp_cache: result.append(int(temp_cache)) temp_cache = "" # 收尾处理字符串末尾的数字 if temp_cache: result.append(int(temp_cache)) - 非数字字符替换拆分法
逻辑和遍历法同源,更贴合部分开发者调用内置函数的编码习惯:- 遍历整个字符串,把所有非数字字符统一替换成不会和数字冲突的分隔符,比如英文逗号、空格
- 全部替换完成后,用选好的分隔符把整个字符串拆成片段
- 过滤掉拆分结果里的空字符串,剩下的片段转成整数,就是需要提取的数字列表
- ASCII码区间判断法
本质是遍历法的变体,只是判断数字的逻辑换成了直接校验ASCII码值:数字0-9对应的ASCII码固定在48到57的连续区间内,遍历每个字符时先取它对应的ASCII码,落在这个区间里的就是数字,后续缓存、收尾逻辑和逐字符遍历法完全一致,适合没有内置字符类型判断函数的极简编程环境。
*注意:所有方案都要提前覆盖边界场景:字符串首尾为数字、字符串内无任何数字、多段数字紧邻的情况,避免漏提取或者返回无效空值。
内容的提问来源于stack exchange,提问作者Tsignadze Giorgi
相关产品推荐
相关产品推荐

