String 从f中的字符串中删除字符#

String 从f中的字符串中删除字符#,string,replace,f#,String,Replace,F#,我在stripchars中有一个列表。这些字符不应出现在字符串文本中。所以我让它变了 所以我做了一些类似的事情: stripchars |> Seq.iter( fun x -> text <- text.Replace(x, ' ') ) 这仍然无法改变文本的状态。正确的方法是什么?尝试使用Seq.fold Seq.fold (fun (str: string) chr -> str.Replace(chr, ' ')) "Hello

我在
stripchars
中有一个
列表。这些字符不应出现在字符串
文本中
。所以我让它变了

所以我做了一些类似的事情:

stripchars |> Seq.iter(
    fun x ->
        text <- text.Replace(x, ' ')
    )
这仍然无法改变
文本的状态。正确的方法是什么?

尝试使用Seq.fold

Seq.fold (fun (str: string) chr -> str.Replace(chr, ' ')) "Hello world" stripchars
折叠是非常强大的。它可以在许多情况下使用,在这些情况下,您需要反复更改某些内容

另外,你不想实际删除字符;不只是用空格代替它们?如果是这样,您应该使用以下选项:

let stripchars chars str =
  Seq.fold
    (fun (str: string) chr ->
      str.Replace(chr |> Char.ToUpper |> string, "").Replace(chr |> Char.ToLower |> string, ""))
    str chars
此外,此解决方案不区分大小写。

由于F#属于.NET堆栈,我们可能依赖于平台库的强大功能。那么这个字符剥离任务就可以简单地实现了

开放系统
开放系统。Linq
让stripChars chars(text:string)=string.Concat(text.Except(stripChars))

更新:不幸的是,后来我意识到这会产生两个序列的集差,这意味着
stripChars“a”“abababab”
将只是
“b”
而不是预期的
“bbb”

继续在LINQ场地正确工作的实施可能会更加冗长:

let stripv1 (stripChars: seq<char>) (text:string) =
    text.Where(fun (c: char) -> not(stripChars.Contains(c))) |> String.Concat    

由于还没有人发布此消息,因此该模块包含您正在寻找的方法

要将给定字符替换为空格(或任何其他给定的单个字符),请使用:

要完全删除给定字符,请使用:


不,我真的想删除它们等等,由于某种原因,第二个出现编译错误。。。试图修复它;修好了。希望这有帮助!请参阅+1或滥用:)(在您更新此内容之前,我们一直在回来发布此内容)
let stripv1 (stripChars: seq<char>) (text:string) =
    text.Where(fun (c: char) -> not(stripChars.Contains(c))) |> String.Concat    
let stripv2 (stripChars: seq<char>) text =
    text |> Seq.filter(fun c -> not (stripChars.Contains c)) |> String.Concat
let stripv3 (stripChars:string) (text:string) =
    text.Split(stripChars.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) |> String.Concat
let strip chars = String.map (fun c -> if Seq.exists((=)c) chars then ' ' else c)

strip "xyz" "123x4y5z789" // 123 4 5 789
let strip chars = String.collect (fun c -> if Seq.exists((=)c) chars then "" else string c)

strip "xyz" "123x4y5z789" // 12345789