【发布时间】:2018-09-11 19:22:14
【问题描述】:
我需要一个正则表达式来匹配和提取具有以下格式的文件名的组:
<artifactName>-<version>-<classifier>.<extension>
地点:
-
<artifactName>可以包含破折号 -
<version>的格式必须为X、X.Y、X.X.Y或X.X.X.Y,其中 X 是任意位数,Y 是可以包含下划线的字母数字字符串 -
<classifier>必须是以下格式之一:
一个。<datestring>b<buildNumber>_<branch>
湾。<branch>
其中<datestring>是一个 14 位数字,<buildNumber>是任意位数,<branch>是任何可以包含短划线或句点的字母数字字符串 -
<extension>可以是任何可以包含下划线的字母数字字符串
到目前为止,我有这个正则表达式,它适用于在线正则表达式测试器,但在 bash 脚本中测试时失败:
^(.+)-((?:[[:digit:]]+\.){0,3}(?:[[:digit:]]+))-((?:([0-9]{14})b([[:digit:]]+)_([^\.]*))|(?:[^\.]*))\.(.+)$
我使用的脚本如下所示:
FILE_NAME='some-artifact-1.2.3.4-20180911123456b123_branch.ex.ten.sion'
REGEX='^(.+)-((?:[[:digit:]]+\.){0,3}(?:[[:digit:]]+))-((?:([0-9]{14})b([[:digit:]]+)_([^\.]*))|(?:[^\.]*))\.(.+)$'
if [[ "${FILE_NAME}" =~ ${REGEX} ]]
then
echo "Artifact = ${BASH_REMATCH[1]}"
echo "Version = ${BASH_REMATCH[2]}"
echo "Classifier = ${BASH_REMATCH[3]}"
echo "Build Date = ${BASH_REMATCH[4]}"
echo "Build Number = ${BASH_REMATCH[5]}"
echo "Branch = ${BASH_REMATCH[6]}"
echo "Extension = ${BASH_REMATCH[7]}"
fi
我假设 bash 使用的解释器需要一些不同的语法,但我不知道如何将在线测试器中的正则表达式转换为 bash 中的正则表达式。
【问题讨论】:
-
bash使用 POSIX 正则表达式,而不是 Perl 兼容的正则表达式,因此没有(?:...)非捕获组。 -
(即POSIX扩展正则表达式,详情咨询
man re_format) -
你可以试试
pcregrep -
@chepner 就是这样!谢谢。