Groovy正则匹配环境列表时如何排除包含指定内容的字符串
Groovy正则过滤需求实现方案
实现方式1:直接修改正则表达式
在原有匹配规则的基础上增加负向先行断言,从字符串起始位置就排除所有包含something的条目,修改后正则为/^(?!.*something)(?:company-.*|MYTEST.*)/
完整代码如下:
def AllEnviroments = ['company-test', 'MYTEST-1234', 'company-somethingelse-something'] // 如需排除多个关键词,可将断言修改为 (?!.*(something|关键词1|关键词2)) def EnviromentChoices = (AllEnviroments =~ /^(?!.*something)(?:company-.*|MYTEST.*)/).findAll().collect().sort() // 输出结果:[MYTEST-1234, company-test]
正则逻辑说明:
^匹配字符串起始位置(?!.*something)负向先行断言,要求整个字符串中不存在something子串(?:company-.*|MYTEST.*)兼容原有匹配规则,匹配company-开头或者MYTEST开头的字符串,?:表示非捕获组,可提升匹配性能
实现方式2:Groovy风格集合过滤(更易维护)
如果禁用词较多,建议拆分匹配逻辑,可读性和可维护性更高:
def AllEnviroments = ['company-test', 'MYTEST-1234', 'company-somethingelse-something'] // 定义禁用词列表,后续新增过滤规则直接加元素即可 def forbiddenKeywords = ['something'] def EnviromentChoices = AllEnviroments.findAll { // 先匹配原有前缀规则 (it ==~ /company-.*/ || it ==~ /MYTEST.*/) // 再排除包含任意禁用词的条目 && !forbiddenKeywords.any { keyword -> it.contains(keyword) } }.sort() // 输出结果:[MYTEST-1234, company-test]
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

