如何在通过字符处理进行字符处理时从字符串中删除字符?

时间:2014-03-14 16:22:35

标签: f#

我对F#相当新,但我很难找到如何正确表示语言中的空字符。 有谁能告诉我如何在F#中表示空字符?

更重要的是,让我走上正轨的是我尝试使用String.mapi进行字符串处理,但我无法弄清楚如何删除下面的字符功能:

let GetTargetFrameworkFolder version =
    let versionMapper i c =
        match c with
        | 'v' -> if i = 0 then char(0x000) else c
        | '.' -> char(0x000)
        | _ -> c

    match version with
        | "v3.5" -> "net35"
        | "v4.0" -> "net40"        
        | "v4.5" -> "net45"  
        | vers -> vers |> String.mapi versionMapper

GetTargetFrameworkFolder "v4.5.1" |> Dump

如何在逐字符处理中删除字符串中的字符,例如String.mapString.mapi

4 个答案:

答案 0 :(得分:2)

您无法使用String.mapi删除字符,因为此函数只将输入中的一个字符映射到输出中的一个字符。 null字符与删除字符不同;它只是碰巧有代码0的另一个角色。

在您的情况下,如果我理解正确您想删除最初的' v' (如果有的话)并删除点。我会这样做:

let GetTargetFrameworkFolder version =
    match version with
    | "v3.5" -> "net35"
    | "v4.0" -> "net40"        
    | "v4.5" -> "net45"
    | vers ->
        let vers = if vers.[0] = 'v' then vers.[1..] else vers
        vers.Replace(".", "")

答案 1 :(得分:2)

如果您想保留原始方法,另一种方法是为字符串编写自己的选择函数:

module String =

    let choosei predicate str =
        let sb = System.Text.StringBuilder()

        let choose i (c:char) = 
            match predicate i c with
                | Some(x) -> sb.Append(c) |> ignore
                | None -> ()

        str |> String.iteri choose 

        sb.ToString()

然后按如下方式使用:

let GetTargetFrameworkFolder version =
    let versionMapper i = function
        | 'v' when i = 0 -> None
        | '.' -> None
        | c -> Some(c)

    match version with
        | "v3.5" -> "net35"
        | "v4.0" -> "net40"        
        | "v4.5" -> "net45"  
        | vers -> vers |> String.choosei versionMapper

GetTargetFrameworkFolder "v4.5.1" |> Dump

答案 2 :(得分:2)

您可以使用数组解析来实现此目的:

let GetTargetFrameworkFolder version =
    match version with
    | "v3.5" -> "net35"
    | "v4.0" -> "net40"        
    | "v4.5" -> "net45"  
    | vers -> new String([|
        for i in 0 .. vers.Length - 1 do
            match i, vers.[i] with
            | 0, 'v' | _, '.' -> () // skip 'v' at [0] and all '.'s
            | _, c -> yield c // let everything else through
    |])

答案 3 :(得分:1)

删除字符时进行字符处理是过滤(stringchar的序列):

let version (s: String) =
    s
    |> Seq.filter (fun ch -> ch <> '.' && ch <> 'v')
    |> String.Concat

<强>更新

首先跳过'v':

let version (s: String) =
    s
    |> Seq.skip (if s.StartsWith "v" then 1 else 0)
    |> Seq.filter ((<>) '.')
    |> String.Concat