ChatOps:使用正则表达式分组,提取字符串需要的部分
前言
前面开发jenkins的时候,就是使用简单的以空格切割来确定消息要实现什么功能,这个真的好low。
- example:
list beijing 1 10 a
动作 执行对象 页码 size 检索关键字
第一个list作为要执行的动作是必须的,后面的beijing ,1,10,a都是不需要出现的。
看看之前的代码怎么实现的(阉割版的还没实现翻页功能,如果要实现可能还需要写上几十行代码):
text := strings.Split(m.Content, " ")
lastWord := text[len(text)-1]
jenkinsName,jenkinsAction,jenkinsProject:="","",lastWord
// 判断是否选择地域,默认的话可以不写jenkins名称,会走一个default,比如build jenkins_project 会走一个
if len(text)==3 {jenkinsName,jenkinsAction,jenkinsProject = text[0],text[1],text[2]
} else if _,ok:=jenkins_client.Config [lastWord];ok{jenkinsName = lastWord
}else{jenkinsName = "default"
}
// 判断是否传入文字
if text[0]!="" {jenkinsAction = text[0]
} else {jenkinsAction = "help"
}
实现
re := regexp.MustCompile(`(?P[a-zA-Z]+)\s*(?P )
match := re.FindStringSubmatch(txt)
groupNames := re.SubexpNames()
result := make(map[string]string)// 转换为map
for i, name := range groupNames {if i != 0 && name != "" { // 第一个分组为空(也就是整个匹配)result[name] = match[i]}
}prettyResult, _ := json.MarshalIndent(result, "", " ")log.Printf("%s",prettyResult)
- example1
input : get 1 ab # 获取默认对象包含ab关键字的第一页
2020/11/24 09:14:55 {"action": "get","object": "","page": "1","size": "","word": "ab"
}
- example2
input: get beijing 1 # 获取北京的第一页数据
2020/11/24 09:31:28 {"action": "get","object": "beijing","page": "1","size": "100","word": ""
}
讲解
(?P[a-zA-Z]+)\s*(?P
():正则分组需要写在括号里面
?P
[a-zA-Z]+:这个单纯的就是表达式
+:代表至少出现一个a-zA-z的字母
*:代表可以出现零次,非必须的。看下面的例子,object和size是非必须的,size要出现的情况下,page也必须要出现
input : get 1 ab # 获取默认对象包含ab关键字的第一页
2020/11/24 09:14:55 {"action": "get","object": "","page": "1","size": "","word": "ab"
}
word 前面必须要跟一个页码或对象。不然会把word匹配到object中。这就是自己定义的规则,
get beijing a
2020/11/24 09:41:51 {"action": "get","object": "beijing","page": "","size": "","word": "a"
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
