匹配正浮点数的Glob-Patterns正确性验证及使用方法咨询
问题1:现有glob模式正确性判断
你给出的三个模式存在多处问题,既不符合你提到的「匹配正浮点数」的初始需求,也无法覆盖你列出的匹配示例,具体问题如下:
- 通用问题:三个模式都没有适配负号规则,仅配置了可选正号
?(+),无法匹配你示例中-98、-0.23、-1.234E07这类负数值;如果你确实只需要匹配正浮点数,那示例中的负数用例本身和需求冲突。 pitg='?(+)*([0-9])'
额外问题:数字部分用了*([0-9])(允许0个数字),会错误匹配空字符串、单独的+号;如果要匹配正整数,修正为pitg='?(+)+([0-9])'即可。pfxp='?(+)*([0-9])?([.,])+([0-9])'
额外问题:强制要求小数点/逗号后至少1位数字,无法匹配你示例中的3、345这类纯整数;如果要同时覆盖正整数和正定点浮点数,修正为pfxp='?(+)(+([0-9])?([.,])*([0-9])|*([0-9])[.,]+([0-9]))',可以同时兼容纯整数、1.23、.23这类格式,同时避免匹配单独的.。pflp='?(+)*([0-9])?([.,])+([0-9])?([eE]?([-+])+([0-9]))'
额外问题:科学计数法部分的规则逻辑错误,当前写法会允许E和后续数字符号分离,错误匹配1.23+45这类非法格式;修正为pflp='?(+)(+([0-9])?([.,])*([0-9])|*([0-9])[.,]+([0-9]))([eE][-+]?+([0-9]))?'即可适配正的科学计数法数值。
问题2:glob模式在条件结构中的用法
你给出的写法if [[ $num == $gptrn ]]; then是可以正常实现glob匹配的,只要满足两个前提:
- 提前开启扩展glob选项:这类
?(...)/+(...)/*(...)语法属于bash的扩展glob能力,需要先执行shopt -s extglob开启,否则会被识别为普通字符。 - 模式变量不要加引号:如果写成
[[ $num == "$gptrn" ]],shell会将模式当做普通字符串做全等匹配,不会触发glob规则。
使用示例:
# 开启扩展glob shopt -s extglob # 定义正整数匹配模式 pitg='?(+)+([0-9])' test_num="+123" if [[ $test_num == $pitg ]]; then echo "数值匹配成功" fi
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

