如何连接正则表达式匹配和没有空格或其他字符的字符串变量?

问题描述 投票:0回答:2

我想在Powershell的文件中用正则表达式替换日期。所有whitespacing都需要保留:

#define    BUILD_DATE          20181010

当前日期是一个变量:

[string]$Today = Get-Date -UFormat "%Y%m%d"

我在替换表达式中使用匹配时学会了使用反引号:

(Get-Content $ItemFullPath) |
Foreach-Object { $_ -replace "(#define\s+?BUILD_DATE\s+?)\S+", "`$1$Today" } |
Set-Content $ItemFullPath

但这会导致:

#define    BUILD_DATE          $Today

我不能在这里添加另一个空格字符。该文件的其他读者和编写者期望存在相同的空白。

powershell
2个回答
1
投票

使用大括号,以便PowerShell和正则表达式引擎不会混淆一个变量/反向引用结束而另一个开始的位置。此外,这里不需要ForEach-Object,因为-replace运算符作为枚举器工作,因此可以直接在数组上使用。

(Get-Content $ItemFullPath) -replace "(#define\s+?BUILD_DATE\s+?)\S+", "`${1}$Today" } |
    Set-Content $ItemFullPath

1
投票

使用带有非消耗look behind断言的RegEx, 没有理由在替换中引用捕获组。

此脚本使用自己的源代码更新日期。

## Q:\Test\2018\10\12\SO_52775631.ps1

#define    BUILD_DATE          20181010

$ItemFullPath = $MyInvocation.MyCommand.Name

[string]$Today = Get-Date -UFormat "%Y%m%d"

(Get-Content $ItemFullPath) -replace "(?<=#define\s+?BUILD_DATE\s+?)\d{8}", $Today |
Set-Content $ItemFullPath
© www.soinside.com 2019 - 2024. All rights reserved.