Groovy只知道路径

时间:2017-08-25 08:40:21

标签: regex groovy

我在Jenkinsfiles中使用groovy。 gradle-build创建一个如下所示的jar:appName-1.0.0-ua67435.jar并复制到/opt/appName

在Jenkinsfile(Groovy)中,我现在想在变量中获取字符串1.0.0-ua67435的这一部分。我希望这个正则表达式可以完成这项工作:-(.*?).jar$

我知道我的文件在哪里,但我不知道它的名字。它是.jar - 文件夹中唯一的/opt/appName/

当我只知道其位置和名称模式时,如何获取文件名的子字符串?

3 个答案:

答案 0 :(得分:1)

试试这个:

new File("/opt/appName/").eachFileMatch(FileType.FILES, ~/^.*-.*?.jar$/, { println it.name })

它使用eachFileMatch将名称与特定模式匹配,您可以从文档链接中查看更多示例。

如果不允许导入,请使用这样的完全限定名称。

...eachFileMatch(groovy.io.FileType.FILES,...

答案 1 :(得分:1)

您可以使用

def names = []
new File("/opt/appName/").eachFileMatch groovy.io.FileType.FILES, ~/(?<=appName-).*(?=[.]jar$)/, { names << it.name }

(?<=appName-).*(?=[.]jar$)正则表达式只会在字符串末尾的appName-.jar之间获取变量部分。如果您在^之前添加appName,则只有在文件名开头时才会匹配。

请参阅regex demo

<强>详情

  • (?<=appName-) - 确保当前位置左侧有appName
  • .* - 除尽可能多的换行符之外的任何0 +字符
  • (?=[.]jar$) - 确保后面有.jar子字符串,紧跟当前位置右侧的字符串位置结束。

有关eachFileMatch here的更多详情。

答案 2 :(得分:0)

您可以FileNameFinder上课轻松找到它:

println new FileNameFinder().getFileNames(folderPath, '**/appName*.jar').collect{ it.substring(it.lastIndexOf('/')+1, it.size())}