You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修正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

原代码问题分析

  1. 正则使用^强制匹配字符串起始,结合全局多行模式igm,易因标签字符串的格式细节导致匹配失败;
  2. \w+仅匹配字母、数字和下划线,若字段值包含其他字符(如连字符)会匹配中断;
  3. 未做空值判断,一旦匹配失败会直接抛出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:48:19