含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 ', ') }
关键调整说明
- 正则表达式优化:将参数值匹配规则从
\w+改为"[^"]+"|\w+,可同时匹配:"[^"]+":带双引号的字符串(如URL)\w+:普通标识符(如valuexy)
- 参数值处理逻辑:循环中判断参数值是否带双引号,带引号的直接去除外层引号保留原始内容;不带引号的则用
${}包裹,完全符合预期输出格式。
内容的提问来源于stack exchange,提问作者Hemanth
相关产品推荐
相关产品推荐

