PowerShell 我想在特定字符序列后截断一个字符串

PowerShell I want to cut off a string after a specific character sequence

我正在尝试解析一个字符串变量,其中 -354 之后的所有内容都被截断。

我有这样的变量:NameOfFile-354-XX.pdf

其中 NameOfFile 可以是任意长度,-XX 可以是任何长度,也可以根本不存在。

我希望此变量的输出为:NameOfFile-354

如何剪切变量以便它在 -354 之后剪切?

到目前为止我尝试过的:

$FileArray = @("Name1-354-03.pdf", "Name23-354-H11.pdf", "Name354-354-02.pdf", "Name3545-354.pdf")
ForEach ($n in $FileArray){
     Write-Host $n.Substring(0, $n.lastIndexOf('-354'))
}

我希望输出是这样的:

Name1-354
Name23-354
Name354-354
Name3545-354

感谢您的帮助。

我不是正则表达式专业人士,但这样的东西对你有用吗?

$string = "NameOfFile-354-XX.pdf"
$regex = "(.*)(-[a-zA-Z0-9]+(.)(.*))"
$match = $string -replace $regex,''

输出将是这样的:

PS C:\temp> $string = "NameOfFile-354-XX.pdf"
$regex = "(.*)(-[a-zA-Z0-9]+(.)(.*))"
$match = $string -replace $regex,''

Write-Host $match
NameOfFile-354

PS C:\temp> 

正则表达式详细信息:https://regex101.com/r/Fw8F3i/1

假设-354是一个常数值:

$FileArray = [System.IO.FileInfo[]]@(
    "Name1-354-03.pdf", "Name23-354-H11.pdf", "Name354-354-02.pdf", "Name3545-354.pdf"
)
$FileArray.ForEach({ $_.Name -replace '(?<=-354).*(\.pdf)', '' })

# Outputs:
Name1-354.pdf
Name23-354.pdf
Name354-354.pdf
Name3545-354.pdf

对于regex的解释:https://regex101.com/r/4Butm2/1

A​​ regex 解决方案 - 例如 - 绝对是一个选项,但你最初尝试中唯一缺少的是 add您要搜索的子字符串的长度 - 即 '-354'.Length == 4 - 到第二个 .Substring() 参数,以便在返回的字符串中包含该子字符串:

"Name1-354-03.pdf", "Name23-354-H11.pdf", "Name354-354-02.pdf", "Name3545-354.pdf" | 
  ForEach-Object {
    $_.Substring(0, $_.LastIndexOf('-354') + 4) # Note the + 4
  }