Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在replace语句中检索powershell中对象中的值?_Regex_Powershell_Replace - Fatal编程技术网

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+
匹配一个或多个空格。为什么要把它拿出来?我知道,但我得到的结果和从你的答案中复制/粘贴时的结果一样,所以我不确定为什么没有它它也能工作