嘗試玩字串,我有這樣的字串:“Hello.Word”或“stackOver.Flow”
我將第一個字符轉換為小寫:“hello.word”和“stackOver.flow”
對于 snakeCase 很容易,我們只需要將 UpperCase 更改為小寫并添加 '_' 但是在 camelCase 中(小寫的 firs char)我不知道該怎么做
open System
let convertToSnakeCase (value:string) =
String [|
Char.ToLower value.[0]
for ch in value.[1..] do
if Char.IsUpper ch then '_'
Char.ToLower ch |]
誰能幫忙?
module Identifier =
open System
let changeCase (str : string) =
if String.IsNullOrEmpty(str) then str
else
let isUpper = Char.IsUpper
let n = str.Length
let builder = new System.Text.StringBuilder()
let append (s:string) = builder.Append(s) |> ignore
let rec loop i j =
let k =
if i = n (isUpper str.[i] && (not (isUpper str.[i - 1])
((i 1) <> n && not (isUpper str.[i 1]))))
then
if j = 0 then
append (str.Substring(j, i - j).ToLower())
elif (i - j) > 2 then
append (str.Substring(j, 1))
append (str.Substring(j 1, i - j - 1).ToLower())
else
append (str.Substring(j, i - j))
i
else
j
if i = n then builder.ToString()
else loop (i 1) k
loop 1 0
type System.String with
member x.ToCamelCase() = changeCase x
printfn "%s" ("StackOver.Flow".ToCamelCase()) //stackOver.Flow
//need stackOver.flow
uj5u.com熱心網友回復:
我懷疑有更優雅和簡潔的解決方案,我感覺你正在學習函式式編程,所以我認為最好用遞回函式來做這樣的事情,而不是使用一些神奇的庫函式。我注意到在你的問題中你使用的是遞回函式,但也是陣列的索引,串列和遞回函式比陣列更容易作業,所以如果你使用遞回,如果它是一個串列,解決方案通常更簡單。
我也會避免使用字串構建器,假設您正在學習 fp,字串構建器是必不可少的,雖然它們顯然有效,但它們不會幫助您使用不可變資料。
然后的關鍵是使用模式匹配來匹配您要用于觸發大寫/小寫邏輯的場景,因為它取決于 2 個連續字符。
我想你希望第一個字符發生這種情況,然后是“。”?
(我插入了一個 '.' 作為第一個字符,以允許遞回函式只處理 '.' 場景,而不是進行特殊情況)。
let convertToCamelCase (value : string) =
let rec convertListToCamelCase (value : char list) =
match value with
| [] -> []
| '.' :: second :: rest ->
'.' :: convertListToCamelCase (Char.ToLower second :: rest)
| c :: rest ->
c :: convertListToCamelCase rest
// put a '.' on the front to simplify the logic (and take it off after)
let convertAsList = convertListToCamelCase ('.' :: (value.ToCharArray() |> Array.toList))
String ((convertAsList |> List.toArray).[1..])
需要擔心的部分是遞回部分,其余部分只是將陣列翻轉到串列,然后再翻轉回來。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533919.html
標籤:细绳F#
