我对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.map
和String.mapi
?
答案 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)
删除字符时进行字符处理是过滤(string
是char
的序列):
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