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

ca9*_*3d9 2 f#

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

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

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

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"
Run Code Online (Sandbox Code Playgroud)

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

"File   name_  (Revised 2018-05-31 15_35_41.16).txt"
Run Code Online (Sandbox Code Playgroud)

Tea*_*Dev 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, "_")
Run Code Online (Sandbox Code Playgroud)