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

Linux下解析.nupkg文件名的包名与版本时正则匹配失败求助

解决Bash中解析nupkg文件名失败的问题

问题原因

你使用的正则表达式里的.*?是非贪婪匹配语法,但Bash的扩展正则表达式(ERE)不支持非贪婪量词,这会导致.*?被当作贪婪的.*处理,进而错误地匹配到字符串末尾的点之前,使得后续的版本部分无法匹配,最终整个正则匹配失败。

解决方案

调整正则表达式,去掉非贪婪语法,改用精准的匹配规则来区分包名和版本号:

string="foo.12.4.1.nupkg"
# 匹配至少包含3段数字的版本号,支持可选的预发布后缀(如12.4.1-beta)
regex='^(.*)\.([0-9]+(?:\.[0-9]+){2,}(?:[-a-z]+)?)\.nupkg$'

if [[ $string =~ $regex ]]; then
  package_name=${BASH_REMATCH[1]}
  package_version=${BASH_REMATCH[2]}
  echo "Package name: $package_name"
  echo "Package version: $package_version"
else
  echo "String does not match regex"
fi

正则说明

  • ^(.*)\.:贪婪匹配到最后一个点之前的所有内容(作为包名,支持包名包含多个点,如foo.bar)
  • ([0-9]+(?:\.[0-9]+){2,}:匹配至少3段数字组成的版本号(如12.4.1、1.2.3.4)
  • (?:[-a-z]+)?:可选匹配预发布版本后缀(如-beta、-rc1)
  • \.nupkg$:匹配文件名末尾的.nupkg后缀

替代方案:不用正则的拆分方法

如果版本号格式固定,也可以用参数替换和拆分来实现,避免正则的兼容性问题:

string="foo.12.4.1.nupkg"
# 先移除.nupkg后缀
base="${string%.nupkg}"
# 拆分版本号(取最后3段)和包名
package_version="${base##*.}"
temp="${base%.*}"
package_version="${temp##*.}.$package_version"
temp="${temp%.*}"
package_version="${temp##*.}.$package_version"
package_name="${temp%.*}"

echo "Package name: $package_name"
echo "Package version: $package_version"

这个方法适合版本号格式固定的场景,无需依赖正则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:09:54