我试图在Linux shell中解析一个.nupkg文件名,如“foo.12.1.2.nupkg”。我试图捕获组并将包名存储在变量package_name
中,并将版本存储在变量version
中。在此示例中,package_name
应该是“foo”,version
应该是“12.1.2”。我使用的是this answer中引用的正则表达式^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$
。
代码如下:
string="foo.12.4.1.nupkg"
regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-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
但是,这始终打印String does not match regex
。
我甚至尝试将其分解为以下组合:
> regex=^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$
> string=foo.12.4.1.nupkg
> [[ $string =~ $regex ]] && echo "matched" || echo "not matched"
或
> regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$'
> string='foo.12.4.1.nupkg'
> [[ $string =~ $regex ]] && echo "matched" || echo "not matched"
或
> regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$'
> string=foo.12.4.1.nupkg
> [[ $string =~ $regex ]] && echo "matched" || echo "not matched"
或
> regex='^(.*?)\.((?:\.?[0-9]+){3,}(?:[-a-z]+)?)\.nupkg$'
> string=foo.12.4.1.nupkg
> [[ ${string} =~ ${regex} ]] && echo "matched" || echo "not matched"
我总是得到“不匹配”的输出。我不知道我做错了什么。我到处找,仍然找不到解决方案。
1条答案
按热度按时间p5fdfcr11#
你可以用
参见online demo:
输出:
true
。(?:[-a-z]+)?
=〉[-a-z]*
),或者转换为捕获(因为POSIX正则表达式不支持前者)。.*?
被替换为.*
(在当前的正则表达式中,它看起来是合理的,因为你只需要在最后3个或更多的点分隔数字处停止)。