Regex 如何在replace语句中检索powershell中对象中的值?
尝试使用对象映射将月份名称替换为月份编号。 用例是,我尝试重命名包含月份名称的文件Regex 如何在replace语句中检索powershell中对象中的值?,regex,powershell,replace,Regex,Powershell,Replace,尝试使用对象映射将月份名称替换为月份编号。 用例是,我尝试重命名包含月份名称的文件 $monthNameToNumberMap = @{ January = '01' February = '02' March = '03' April = '04' May = '05' June = '06' July = '07' August = '08' September = '09' October = '10' November = '11' Dec
$monthNameToNumberMap = @{
January = '01'
February = '02'
March = '03'
April = '04'
May = '05'
June = '06'
July = '07'
August = '08'
September = '09'
October = '10'
November = '11'
December = '12'
}
Write-Host "Desired : 02 20 => ";
"February 20" -Replace '([A-z]{3,9}) (\d{2})', "$monthNameToNumberMap[`$1] `$2"
Write-Host "Desired : 05 03 => ";
"May 03" -Replace '([A-z]{3,9}) (\d{2})', "$monthNameToNumberMap[`$1] `$2"
# receiving : @{January=01; February=02; March=03; April=04; May=05; June=06; July=07; August=08; September=09; October=10; November=11; December=12}[February] 20
我无法使用regex匹配组访问对象映射的值。您试图在字符串替换模式中计算backreference值,这是不可能的。您需要定义回调并将其传递给
[regex]::Replace
方法:
$regex = [regex]'\b([A-Za-z]{3,}) (\d{2})\b'
$callback = { param($m) $monthNameToNumberMap[$m.Groups[1].Value] + " " + $m.Groups[2].Value }
$regex.Replace("February 20", $callback)
请注意,[A-z]
,因此建议使用[A-zA-z]
我还添加了单词边界,以避免匹配字符串,如aaaaaaaaaaaa2222222
这里有一种不同的方法来完成这项工作。[grin]它使用内置的
.MonthNames
列表将月份名称转换为数字
如果需要保持区域性不变,可以使用[System.Globalization.DateTimeFormatInfo]::InvariantInfo.MonthNames
而不是获取区域性
列表
$DateStringList = @(
'February 20'
'January 3'
'August 14'
'June 19'
)
$MonthNameList = (Get-Culture).DateTimeFormat.MonthNames
foreach ($DSL_Item in $DateStringList)
{
$MonthName, [int]$DayNumber = $DSL_Item.Split(' ')
$MonthNumber = $MonthNameList.IndexOf($MonthName) + 1
'Source date = {0}' -f $DSL_Item
'{0} is month # {1}' -f $MonthName, $MonthNumber
'Numeric date = {0:D2}/{1:D2}' -f $MonthNumber, $DayNumber
'=' * 20
}
输出
Source date = February 20
February is month # 2
Numeric date = 02/20
====================
Source date = January 3
January is month # 1
Numeric date = 01/03
====================
Source date = August 14
August is month # 8
Numeric date = 08/14
====================
Source date = June 19
June is month # 6
Numeric date = 06/19
====================
适用于所有版本的PowerShell
在PowerShell Core(v6.1及更高版本)中,您现在可以使用-replace
解决此问题,即通过传递脚本块作为替换操作数:
"February 20" -replace '\b([A-z]{3,9}) (\d{2})\b', {
$monthNameToNumberMap[$_.Groups[1].Value] + ' ' + $_.Groups[2].Value
}
$\uu
脚本块中有一个实例,就是手边的匹配项。脚本块的输出被用作替换字符串。感谢您的回答,当我尝试使用此字符串时,返回值仅为“20”。我不明白为什么,你能帮我检查一下吗?@InkhSuTesou看到我在v5中的截图,我拿出
\s
,它会返回你想要的结果want@trebleCode\s+
匹配一个或多个空格。为什么要把它拿出来?我知道,但我得到的结果和从你的答案中复制/粘贴时的结果一样,所以我不确定为什么没有它它也能工作