Regex 替换除最后一个字符外的所有字符实例

Regex 替换除最后一个字符外的所有字符实例,regex,powershell,Regex,Powershell,我正在编写一个快速PowerShell脚本来替换除最后一个实例之外的所有句点。 例如: 你好。这是一个文件.name.doc→ 您好,这是一个文件名。doc 与另一篇文章相比,我能够得到这个regexp,但它不适用于PowerShell: \(?=[^.]*\) 根据,它只匹配某个期间的第一次出现 编辑: 基本上,我需要应用这个匹配并用子目录替换目录。到目前为止,我有: Get-ChildItem -Filter "*.*" | ForEach { $_.BaseName.Replac

我正在编写一个快速PowerShell脚本来替换除最后一个实例之外的所有句点。 例如:

你好。这是一个文件.name.doc→ <代码>您好,这是一个文件名。doc

与另一篇文章相比,我能够得到这个regexp,但它不适用于PowerShell:

\(?=[^.]*\)
根据,它只匹配某个期间的第一次出现

编辑: 基本上,我需要应用这个匹配并用子目录替换目录。到目前为止,我有:

Get-ChildItem -Filter "*.*" | ForEach {
    $_.BaseName.Replace('.','') + $_.Extension
}
但它实际上并没有替换这些项,我也不认为它是递归的

我尝试了一些变化:

Get-Item -Filter "*.*" -Recurse |
    Rename-Item -NewName {$_.BaseName.Replace(".","")}
但是我得到了错误信息

源路径和目标路径必须不同


将basename中没有句点的文件从重命名中排除:

Get-ChildItem -File -Recurse | Where-Object { $_.BaseName -like '*.*' } |
    Rename-Item -NewName {$_.BaseName.Replace('.', '') + $_.Extension}

将basename中没有句点的文件从重命名中排除:

Get-ChildItem -File -Recurse | Where-Object { $_.BaseName -like '*.*' } |
    Rename-Item -NewName {$_.BaseName.Replace('.', '') + $_.Extension}

请注意,PowerShell默认使用“g”和“m”修饰符。请将它们添加到RegEx101.com()的修改器框中。。那就解决了。。因此,如果我要匹配并替换,那么/gm是否会与regexp一起出现在引号中?与旁注中的
-match'/\.(?=[^.]*\]/gm'
)一样,如果这确实是针对文件名的,并且您正在使用[FileInfo]对象,请使用BaseName属性而不是Name属性,它将自动排除扩展名。因此,
Get Item C:\Temp\File.Name.txt | ForEach{$\uu0.BaseName.Replace('.','')+$\u0.Extension}
将输出
FileName.txt
不,您不必在PowerShell中执行任何操作。g和m修饰符是隐含的,不需要进行任何切换。如果您想显式地声明您想要使用那些,您可以将它包括在正则表达式模式中,比如:
-match'(?gm)/\(?=[^.]*\)
Hm,
GCI.\*”-Recurse |?{$.BaseName-match'\.}Ren NewName{$.BaseName.Replace('.,'')+$.Extension}
,这应该可以满足您的要求。我猜您正在尝试重命名一个没有句点的文件,以便新名称和旧名称相同。请注意,PowerShell默认使用“g”和“m”修饰符。请将它们添加到RegEx101.com()的修改器框中。。那就解决了。。因此,如果我要匹配并替换,那么/gm是否会与regexp一起出现在引号中?与旁注中的
-match'/\.(?=[^.]*\]/gm'
)一样,如果这确实是针对文件名的,并且您正在使用[FileInfo]对象,请使用BaseName属性而不是Name属性,它将自动排除扩展名。因此,
Get Item C:\Temp\File.Name.txt | ForEach{$\uu0.BaseName.Replace('.','')+$\u0.Extension}
将输出
FileName.txt
不,您不必在PowerShell中执行任何操作。g和m修饰符是隐含的,不需要进行任何切换。如果您想显式地声明您想要使用那些,您可以将它包括在正则表达式模式中,比如:
-match'(?gm)/\(?=[^.]*\)
Hm,
GCI.\*”-Recurse |?{$.BaseName-match'\.}Ren NewName{$.BaseName.Replace('.,'')+$.Extension}
,这应该可以满足您的要求。我猜您正在尝试重命名一个没有句点的文件,以便新名称和旧名称相同。