如何用正则表达式捕获Bash中的整数与浮点数
解决方案
你之前修改的正则^[[:space:]]*([[:digit:].]+)[[:space:]]*([kmg])b?[[:space:]]*$存在明显缺陷:它会匹配包含多个小数点(比如23..78)或仅含小数点(比如..)的无效格式,不符合数值的规范要求。
要同时匹配整数和合法浮点数,需要限制小数点的出现次数,且确保数值整体至少包含一个有效数字。以下是两种适配不同场景的修正方案:
方案1:支持带前导小数点的浮点数(如.789 MB)
该方案覆盖整数、标准浮点数(如23.789)以及仅含小数部分的数值:
^[[:space:]]*([[:digit:]]*\.?[[:digit:]]+)[[:space:]]*([kmg])b?[[:space:]]*$
- 捕获组1逻辑:
[[:digit:]]*匹配0个或多个整数部分,\.?匹配0个或1个小数点,[[:digit:]]+确保至少有一组数字,避免纯小数点的无效情况。
方案2:仅支持整数和标准浮点数(如23或23.789,拒绝.789)
如果你的业务场景不需要前导小数点的数值,可使用更严格的版本:
^[[:space:]]*([[:digit:]]+(\.[[:digit:]]+)?)[[:space:]]*([kmg])b?[[:space:]]*$
- 捕获组1逻辑:
[[:digit:]]+匹配至少1个整数部分,(\.[[:digit:]]+)?匹配可选的小数点+小数部分,保证要么是纯整数,要么是带小数的标准格式。
验证效果
两种方案都能正确匹配以下合法输入:
23 MB→ 捕获数值23,单位M23.789 GB→ 捕获数值23.789,单位G123 kB→ 捕获数值123,单位k
同时会自动拒绝无效格式:
23..78 MB→ 不匹配. MB→ 不匹配abc MB→ 不匹配
如果需要支持单位大小写(比如MB或mb),可以把[kmg]修改为[kmgKMG],或者根据使用的正则引擎添加不区分大小写的修饰符。
内容的提问来源于stack exchange,提问作者Chandan
相关产品推荐
相关产品推荐

