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
相关产品推荐
相关产品推荐

