如何在Bash中检查以值、字符串或引用传递的任意定义数字?
解决方案:多类型数字验证实现方案
核心思路
通过正则规则组合+输入类型适配,覆盖所有需求中的数字格式,同时兼容直接值、字符串、变量引用三种输入形式。
各类数字的匹配规则
1. 十进制整数/浮点数(支持./,作为小数分隔符)
匹配普通整数、带小数的浮点数,确保分隔符唯一:
^[-+]?\d+(?:[.,]\d+)?$
2. 十六进制数
匹配0x开头,包含0-9、a-f、A-F的合法十六进制串:
^0x[0-9a-fA-F]+$
3. 八进制数
匹配以0开头的合法八进制数字:
^0[0-7]+$
4. 科学计数法
兼容两种格式:e/E表示法(如52e-14)和*10^表示法(如-2*10^8):
^[-+]?(?:\d+(?:[.,]\d+)?)(?:[eE][-+]?\d+|\*10\^[-+]?\d+)$
5. 自定义基数数字
匹配<base>#n格式,基数范围2-64,数字字符限定为0-9、a-f、A-F:
^(?:[2-9]|[1-5]\d|6[0-4])#[0-9a-fA-F]+$
统一验证函数(Python示例)
以下函数可处理三种输入形式,直接复用或根据你的开发语言调整:
import re def is_valid_number(input_data): # 处理变量引用:这里模拟变量解析逻辑,实际需对接你的变量系统 if isinstance(input_data, str) and input_data.startswith('$'): input_data = _resolve_variable(input_data) # 统一转为字符串处理 num_str = str(input_data).strip() # 组合所有验证规则 validator = re.compile( r'^[-+]?\d+(?:[.,]\d+)?$' r'|^0x[0-9a-fA-F]+$' r'|^0[0-7]+$' r'|^[-+]?(?:\d+(?:[.,]\d+)?)(?:[eE][-+]?\d+|\*10\^[-+]?\d+)$' r'|^(?:[2-9]|[1-5]\d|6[0-4])#[0-9a-fA-F]+$' ) return validator.match(num_str) is not None def _resolve_variable(var_ref): # 示例:根据变量引用获取对应值,实际需替换为业务逻辑 var_map = {'$hex_num': '0x1f3', '$custom_base': '32#g7'} return var_map.get(var_ref, '')
使用说明
- 直接传入数值(int/float):自动转为字符串后验证
- 传入字符串:直接执行正则匹配
- 传入变量引用:通过
_resolve_variable解析为实际值后验证
额外提示
- 若需要将验证通过的自定义基数数字转为十进制,可基于基数对数字部分做进制转换
- 科学计数法中的
*10^格式,如需计算实际数值,可先替换为e格式再转换 - 如需支持千位分隔符等扩展场景,可在正则规则中添加对应匹配逻辑
内容的提问来源于stack exchange,提问作者fozzybear
相关产品推荐
相关产品推荐

