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



我正在尝试检查来自 git 的commit-msg是否包含特定的票号,其项目键为Jira在 Jenkins 管道中使用 groovy

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

为了提取数字,我使用以下逻辑。

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

不确定如何使用项目密钥提取确切的票号。 提前谢谢。

您可以使用Groovy的find运算符-=~,结合findAll()方法来提取所有匹配的元素。为此,您可以创建一个与CO-d+ORDEOPSDESK-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"]

正则表达式可以组装得更简单一些:

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

最新更新