如何验证文件是否符合‘实数:实数:...:实数:’的格式规范?
修正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"
修正说明
- 实数匹配规则优化:覆盖所有合法实数格式:
-?[0-9]+(\.[0-9]*)?:匹配带可选负号的整数(如-3、15),或整数加小数部分(如3.4、-2.5)-?\.[0-9]+:匹配带可选负号的纯小数(如.0504、-.3)
- 统一所有元素规则:将冒号后的每个元素都应用相同的实数匹配规则,确保任意位置的负实数都能被正确识别。
运行结果
修正后脚本会正确输出:
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
相关产品推荐
相关产品推荐

