You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证文件是否符合‘实数:实数:...:实数:’的格式规范?

修正Bash正则匹配含负实数行的问题

问题说明

需要验证文件每行格式是否符合要求:每行由冒号分隔的实数组成,结尾必须以冒号结束,实数允许包含正负号及小数部分(包括.0504这类无整数部分的纯小数)。当前脚本错误地将含负实数的行判定为无效,正确结果应仅标记含非实数内容的第3、4行为无效。

示例文件内容

1:15:0:.0504:.1092:0:0:0:0:0:0:0:0:
2:15:1:0:0:.0504:.0504:0:0:0:0:0:0:3:.345:3.4:
hello
3:5:0:0:0:0:0:hello:0:0:0:0:0:
5:13:1:0:-3:0:0:.0378:0:0:0:0:0:
6:10:0:0:0:0:0:.0540:0:0:.0840:0:343:345:32:33:.1:

当前错误的正则与脚本

原正则仅允许第一个元素带负号,后续元素未考虑负号匹配,导致含负实数的行被误判:

pattern="^(-?[0-9]+(\.[0-9]*)?(:[0-9]*(\.[0-9]*)*)*):$"

while IFS= read -r linea; do
    if [[ -n $linea ]]; then
        if [[ $linea =~ $pattern ]]; then
            echo "Valid line: $linea"
        else
            echo "Invalid line: $linea"
        fi
    fi
done < "$file"

修正后的正则与脚本

修正后的正则表达式

pattern="^(-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+)(:(-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+))*:$"

完整验证脚本

pattern="^(-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+)(:(-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+))*:$"

while IFS= read -r linea; do
    if [[ -n $linea ]]; then
        if [[ $linea =~ $pattern ]]; then
            echo "Valid line: $linea"
        else
            echo "Invalid line: $linea"
        fi
    fi
done < "$file"

修正说明

  1. 实数匹配规则优化:覆盖所有合法实数格式:
    • -?[0-9]+(\.[0-9]*)?:匹配带可选负号的整数(如-3、15),或整数加小数部分(如3.4、-2.5)
    • -?\.[0-9]+:匹配带可选负号的纯小数(如.0504、-.3)
  2. 统一所有元素规则:将冒号后的每个元素都应用相同的实数匹配规则,确保任意位置的负实数都能被正确识别。

运行结果

修正后脚本会正确输出:

Valid line: 1:15:0:.0504:.1092:0:0:0:0:0:0:0:0:
Valid line: 2:15:1:0:0:.0504:.0504:0:0:0:0:0:0:3:.345:3.4:
Invalid line: hello
Invalid line: 3:5:0:0:0:0:0:hello:0:0:0:0:0:
Valid line: 5:13:1:0:-3:0:0:.0378:0:0:0:0:0:
Valid line: 6:10:0:0:0:0:0:.0540:0:0:.0840:0:343:345:32:33:.1:

内容的提问来源于stack exchange,提问作者Pablo Setrakyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:45:24