如何从groovy中的字符串中提取具有数字的给定字符串数组

时间:2020-01-10 07:14:28

标签: grails groovy jenkins-groovy

我正在尝试使用Jenkins管道中的groovy检查git中的commit-msg是否包含特定的凭单编号,其项目密钥为Jira

def string_array = ['CO', 'DEVOPSDESK', 'SEC', 'SRE', 'SRE00IN', 'SRE00EU', 'SRE00US', 'REL']
def string_msg = 'CO-10389, CO-10302 new commit'

要提取数字,我正在使用以下逻辑。

findAll( /\d+/ )*.toInteger()

不确定如何使用项目密钥提取确切的凭单号码。 预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以将Groovy的find运算符-=~findAll()方法结合使用以提取所有匹配的元素。为此,您可以创建与CO-\d+DEOPSDESK-\d+ OR ...匹配的模式,依此类推。您可以将项目ID保留在列表中,然后动态创建正则表达式模式。

请考虑以下示例:

def projectKeys = ['CO', 'DEVOPSDESK', 'SEC', 'SRE', 'SRE00IN', 'SRE00EU', 'SRE00US', 'REL']
def commitMessage = 'CO-10389, CO-10302 new commit'

// Generate a pattern "CO-\d+|DEVOPSDEKS-\d+|SEC-\d+|...
def pattern = projectKeys.collect { /${it}-\d+/ }.join("|")

// Uses =~ (find) operator and extracts matching elements
def jiraIds = (commitMessage =~ pattern).findAll()

assert jiraIds == ["CO-10389","CO-10302"]

// Another example
assert ("SEC-1,REL-2001 some text here" =~ pattern).findAll() == ["SEC-1","REL-2001"]

答案 1 :(得分:0)

正则表达式可以更简单地组装:

def projectKeys = ['CO', 'DEVOPSDESK', 'SEC', 'SRE', 'SRE00IN', 'SRE00EU', 'SRE00US', 'REL'] 
def commitMessage = 'CO-10389, REL-10302 new commit'

String regex = /(${projectKeys.join('|')})-\d+/

assert ['CO-10389', 'REL-10302'] == (commitMessage =~ regex).findAll()*.first()

您还可以选择另一个比匹配更精细的选项:

def res = []
commitMessage.eachMatch( regex ){ res << it[ 0 ] }
assert ['CO-10389', 'REL-10302'] == res