我在我的 Jenkinsfiles 中使用了 groovy。gradle-build创建一个看起来像这样的罐子:appName-1.0.0-ua67435.jar
并复制到/opt/appName
在 Jenkinsfile (Groovy( 中,我现在喜欢将字符串的这一部分1.0.0-ua67435
在变量中。我希望这个正则表达式应该完成这项工作:-(.*?).jar$
我知道我的文件在哪里,但我不知道它的名字。它是/opt/appName/
文件夹中唯一的.jar
。
当我只知道文件名的位置和名称模式时,如何获取其子字符串?
试试这个:
new File("/opt/appName/").eachFileMatch(FileType.FILES, ~/^.*-.*?.jar$/, { println it.name })
它使用每个文件匹配将名称与特定模式匹配,您可以从文档链接中看到更多示例。
如果不允许导入,则像这样使用完整的限定名。
...eachFileMatch(groovy.io.FileType.FILES,...
您可以使用
def names = []
new File("/opt/appName/").eachFileMatch groovy.io.FileType.FILES, ~/(?<=appName-).*(?=[.]jar$)/, { names << it.name }
(?<=appName-).*(?=[.]jar$)
正则表达式将只获取字符串末尾的appName-
和.jar
之间的变量部分。如果在appName
之前添加^
,则仅当它位于文件名的开头时才会匹配。
请参阅正则表达式演示。
详
(?<=appName-)
- 确保当前位置左侧有appName
.*
- 除换行符字符以外的任何 0+ 字符尽可能多(?=[.]jar$)
- 确保在当前位置的右侧有一个子字符串,后跟.jar
字符串位置的末尾。
有关eachFileMatch
的更多详细信息,请点击此处。
您可以FileNameFinder
类轻松找到它:
println new FileNameFinder().getFileNames(folderPath, '**/appName*.jar').collect{ it.substring(it.lastIndexOf('/')+1, it.size())}