我想编写一个小的实用函数,用破折号替换文件名中任何被禁止字符的序列。
例如:
foo.txt
==>foo.txt
Some string \o/
==>Some string -o-
https://stackoverflow.com/questions
==>https-stackoverflow.com-questions
我像这样编写函数:
function Get-SafeFileName{
param(
[Parameter(Mandatory, Position=0, ValueFromPipeline)]
[object]$Data
)
process {
$pattern = "[" + [regex]::Escape([string][System.IO.Path]::GetInvalidFileNameChars()) +"]+"
[regex]::Replace($Data, $pattern, "-")
}
}
这个代码可以工作,但空格字符被替换了,即使它是一个允许的字符。
This is a string
会变成 This-is-a-string
,这并不是必要的。
怎么解决呢?
深入探究后发现,[System.IO.Path]::GetInvalidFileNameChars()
不包含空格字符(ASCII码32),但还有其它很多类似空格的字符。
也许正则表达式引擎看不到这些细微的差别?
[regex]::Escape
来转义进入字符类的字符。 - Wiktor StribiżewRegex.Escape
不应用于转义字符类中的字符。 - Wiktor Stribiżew