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

含URL参数的Build Job格式转换失效问题求助

问题:带URL参数的build语句无法被PowerShell正则转换

问题背景

我有一个包含parallel代码块与build语句的文件,需要将所有build job转换为指定格式。使用Santiago Squarzon提供的PowerShell代码可完成大部分转换,但当build语句中存在带引号的URL参数时,最后一条jobxy的转换被跳过,无法得到预期输出。

原文件内容

parallel
(
{
    build( "job2", parameter3: value3, parameter4: value4, parameter5: value5 )
    build( "job1", parameter1: value1, parameter2: value2 )
)
}
parallel 
(
{
    build( "job3", parameter6: value6, parameter7: value7, parameter8: value8,  parameter9: value9 )
}
)

build( "jobx", parameterx: valuex, parameterx: valuex, parameterx: valuex,  parameterx: valuex )

build( "jobxx", parameterxx: valuexx, parameterxx: valuexx, parameterx: valuex,  parameterx: valuex )

build("jobxy", parameterxy: "https://abc-xyz.pqrs.com", parameterxy: valuexy, parameterxy: valuexy)

使用的PowerShell代码

$teststrings = Get-Content path\to\file.txt

$re = [regex]::new(
    '(?<=build\()\s*"(?<jobname>[^""]+)"(?:,\s*(?<paramname>\w+)\s*:\s*(?<paramvalue>\w+))+',
    [System.Text.RegularExpressions.RegexOptions] 'Compiled, IgnoreCase')

foreach ($string in $teststrings) {
    $match = $re.Match($string)

    if (-not $match.Success) {
        continue
    }

    $params = @($match.Groups['paramname'].Captures.Value)
    $values = @($match.Groups['paramvalue'].Captures.Value)

    $groups = for ($i = 0; $i -lt $params.Count; $i++) {
        "string(name: '{0}', value: ""`${{{1}}}"")" -f $params[$i], $values[$i]
    }

    "build job: '{0}', parameters: [{1}]" -f $match.Groups['jobname'].Value, ($groups -join ', ')
}

当前输出

build job: 'job2', parameters: [string(name: 'parameter3', value: "${value3}"), string(name: 'parameter4', value: "${value4}"), string(name: 'parameter5', value: "${value5}")]
build job: 'job1', parameters: [string(name: 'parameter1', value: "${value1}"), string(name: 'parameter2', value: "${value2}")]
build job: 'job3', parameters: [string(name: 'parameter6', value: "${value6}"), string(name: 'parameter7', value: "${value7}"), string(name: 'parameter8', value: "${value8}"), string(name: 'parameter9', value: "${value9}")]
build job: 'jobx', parameters: [string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}")]
build job: 'jobxx', parameters: [string(name: 'parameterxx', value: "${valuexx}"), string(name: 'parameterxx', value: "${valuexx}"), string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}")]

预期输出

build job: 'job2', parameters: [string(name: 'parameter3', value: "${value3}"), string(name: 'parameter4', value: "${value4}"), string(name: 'parameter5', value: "${value5}")]
build job: 'job1', parameters: [string(name: 'parameter1', value: "${value1}"), string(name: 'parameter2', value: "${value2}")]
build job: 'job3', parameters: [string(name: 'parameter6', value: "${value6}"), string(name: 'parameter7', value: "${value7}"), string(name: 'parameter8', value: "${value8}"), string(name: 'parameter9', value: "${value9}")]
build job: 'jobx', parameters: [string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}")]
build job: 'jobxx', parameters: [string(name: 'parameterxx', value: "${valuexx}"), string(name: 'parameterxx', value: "${valuexx}"), string(name: 'parameterx', value: "${valuex}"), string(name: 'parameterx', value: "${valuex}")]

build job: 'jobxy', parameters: [string(name: 'parameterxy', value: "https://abc-xyz.pqrs.com"), string(name: 'parameterxy', value: "${valuexy}"), string(name: 'parameterxy', value: "${valuexy}")]

解决方案

问题出在原正则表达式对参数值的匹配限制:\w+仅能匹配字母、数字和下划线,无法识别带引号的URL这类含特殊字符的参数值。需要修改正则规则,并调整参数值的处理逻辑,实现两种参数值的兼容转换。

修改后的PowerShell代码

$teststrings = Get-Content path\to\file.txt

# 修正正则:支持匹配带双引号的字符串和普通标识符
$re = [regex]::new(
    '(?<=build\()\s*"(?<jobname>[^"]+)"(?:,\s*(?<paramname>\w+)\s*:\s*(?<paramvalue>"[^"]+"|\w+))+',
    [System.Text.RegularExpressions.RegexOptions] 'Compiled, IgnoreCase')

foreach ($string in $teststrings) {
    $match = $re.Match($string)

    if (-not $match.Success) {
        continue
    }

    $params = @($match.Groups['paramname'].Captures.Value)
    $values = @($match.Groups['paramvalue'].Captures.Value)

    $groups = for ($i = 0; $i -lt $params.Count; $i++) {
        $val = $values[$i]
        # 区分带引号和不带引号的参数值
        if ($val.StartsWith('"') -and $val.EndsWith('"')) {
            $formattedVal = $val.Trim('"')
        }
        else {
            $formattedVal = "`${$val}"
        }
        "string(name: '{0}', value: ""{1}"")" -f $params[$i], $formattedVal
    }

    "build job: '{0}', parameters: [{1}]" -f $match.Groups['jobname'].Value, ($groups -join ', ')
}

关键调整说明

  1. 正则表达式优化:将参数值匹配规则从\w+改为"[^"]+"|\w+,可同时匹配:
    • "[^"]+":带双引号的字符串(如URL)
    • \w+:普通标识符(如valuexy)
  2. 参数值处理逻辑:循环中判断参数值是否带双引号,带引号的直接去除外层引号保留原始内容;不带引号的则用${}包裹,完全符合预期输出格式。

内容的提问来源于stack exchange,提问作者Hemanth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:05:55