将多个后续无效字符转换为一个下划线?

时间:2018-06-04 22:55:49

标签: f#

以下字符串不是有效的文件名。

"File   name\r\n\t\t\t\t\r\n\t\t\t\t  (Revised 2018-05-31 15:35:41.16).txt"

以下代码将其转换为有效的文件名。

let fn = """File   name

                  (Revised 2018-05-31 15:35:41.16).txt""";;
let invalid = System.IO.Path.GetInvalidFileNameChars();;

String.Join("",
    fn |> Seq.filter(fun x -> 
        not (Array.exists (fun y -> y = x) invalid)
        ) 
)
// "File   name        (Revised 2018-05-31 153541.16).txt"

它只是删除了这些无效字符。如何将这些无效转换为_?对于这些多个后续无效字符,我希望将它们替换为仅一个_。所以预期的结果应该是

"File   name_  (Revised 2018-05-31 15_35_41.16).txt"

1 个答案:

答案 0 :(得分:5)

这应该有效:

open System.Text.RegularExpressions

let normalizeFileName name =
    let invalidPattern =
        System.IO.Path.GetInvalidFileNameChars()
        |> Seq.map (string >> Regex.Escape)
        |> String.concat ""
        |> sprintf "[%s]+"

    Regex.Replace(name, invalidPattern, "_")