gpt4 book ai didi

regex - 替换无效的文件名字符

转载 作者:行者123 更新时间:2023-12-04 14:56:28 25 4
gpt4 key购买 nike

我想写一个小实用函数,用破折号替换文件名中任何禁止使用的字符序列

例如:

  • foo.txt ==> foo.txt
  • 一些字符串\o/ ==> 一些字符串 -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 转义转到字符类的字符,因为它意在转义必须是 之外的文字字符字符类。

修复是

function Get-SafeFileName{
param(
[Parameter(Mandatory, Position=0, ValueFromPipeline)]
[object]$Data
)
process {

$pattern = '[' + ([System.IO.Path]::GetInvalidFileNameChars() -join '').Replace('\','\\') + ']+'

[regex]::Replace($Data, $pattern, "-")
}
}

唯一需要在字符类中转义的字符是:

  • ^
  • -
  • \
  • ].

由于 GetInvalidFileNameChars() 只包含提到的四个特殊字符之一,您可以只使用一个 .Replace('\', '\\')而不是所有四个 .Replace('\','\\') .Replace('-','\-').Replace('^','\^').Replace(']', '\]').

关于regex - 替换无效的文件名字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67884618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com