请求修正JavaScript正则表达式以提取Dynatrace标签指定字段
从Dynatrace标签中提取指定字段的正则表达式修复
尝试使用正则表达式从Dynatrace的标签字符串中提取SnowAppID、Environment、CFU三个字段的值,但现有代码未生效。
原代码如下:
} else { //Regex to find CFU, Environment & Snowappid from tags var add_info_parser = JSON.parse(requestBody); var regex_match = new RegExp(/^(?=.*Environment:\s*(\w+))(?=.*CFU:\s*(\w+))(?=.*SnowAppID:\s*(\w+)).*/igm); var tags = add_info_parser.Tags; gs.info("Dynatarce before regex match" + tags); regex_match = regex_match.exec(tags); gs.info("Dynatrace regex value" + regex_match); appIdTag = regex_match[3].toString(); environmentTag = regex_match[1].toString(); var CFU_value = regex_match[2].toString().toLowerCase(); if (cfuOverride.indexOf(CFU_value) > -1) { overrideBinding = true; } }
目标标签字符串:
"EnterpriseCloud, Environment:PROD, Data Centre:London, ServiceNow-Integrated:True, CFU:Consumer, SnowAppID:APP12130, Application:KCIM"
需要提取的内容:
- SnowAppID: APP12130
- Environment: PROD
- CFU: Consumer
原代码问题分析
- 正则使用
^强制匹配字符串起始,结合全局多行模式igm,易因标签字符串的格式细节导致匹配失败; \w+仅匹配字母、数字和下划线,若字段值包含其他字符(如连字符)会匹配中断;- 未做空值判断,一旦匹配失败会直接抛出
Cannot read property 'toString' of undefined错误。
解决方案
方案1:单独匹配每个字段(推荐,容错性强)
针对每个字段编写独立正则,单个字段缺失不影响其他字段提取,同时增加空值处理:
} else { var add_info_parser = JSON.parse(requestBody); var tags = add_info_parser.Tags; gs.info("Dynatrace before regex match: " + tags); // 匹配Environment字段值 const envRegex = /Environment:\s*([^,]+)/i; const environmentTag = envRegex.exec(tags)?.[1] || 'N/A'; // 匹配CFU字段值 const cfuRegex = /CFU:\s*([^,]+)/i; const CFU_value = cfuRegex.exec(tags)?.[1]?.toLowerCase() || ''; // 匹配SnowAppID字段值 const snowRegex = /SnowAppID:\s*([^,]+)/i; const appIdTag = snowRegex.exec(tags)?.[1] || 'N/A'; gs.info(`Extracted values - Env: ${environmentTag}, CFU: ${CFU_value}, SnowAppID: ${appIdTag}`); if (cfuOverride.indexOf(CFU_value) > -1) { overrideBinding = true; } }
方案2:一次性匹配所有字段(适合确定字段必存的场景)
调整正则逻辑,使用[^,]+匹配逗号前的所有内容,增加dotAll修饰符兼容换行情况:
} else { var add_info_parser = JSON.parse(requestBody); var tags = add_info_parser.Tags; gs.info("Dynatrace before regex match: " + tags); const regex = /Environment:\s*([^,]+).*?CFU:\s*([^,]+).*?SnowAppID:\s*([^,]+)/s; const match = regex.exec(tags); if (match) { const environmentTag = match[1]; const CFU_value = match[2].toLowerCase(); const appIdTag = match[3]; gs.info(`Extracted values - Env: ${environmentTag}, CFU: ${CFU_value}, SnowAppID: ${appIdTag}`); if (cfuOverride.indexOf(CFU_value) > -1) { overrideBinding = true; } } else { gs.info("No match found for all required tags"); } }
关键优化点
- 用
[^,]+替代\w+,确保能匹配逗号前的任意字符(包括空格、连字符等); - 新增可选链操作符
?.和默认值,避免匹配失败时抛出错误; - 方案1的独立正则模式,适配字段顺序变化或单个字段缺失的场景。
内容的提问来源于stack exchange,提问作者Amit Thakur
相关产品推荐
相关产品推荐

