2016-12-19 63 views
1

我有一個字符串,它是第一和姓氏的組合:掩蔽首先與姓字符串*

約翰尼·塔克

我想屏蔽該字符串一樣,在斯威夫特3:

Ĵ*****牛逼***

我怎麼能做到這一點?

+3

請出示你已經嘗試了什麼。 – shallowThought

+3

如果有中間名(可以縮寫或不可以),該怎麼辦?外文名稱如中文怎麼樣? –

+0

@shallow如果你不知道從哪裏開始,那麼很難展現出一些東西。 @ mTuran這是一個很酷的問題:) – Fluidity

回答

8

你可以例如使用小寫字符模式匹配和替換那些匹配星號字符圖案(*)認爲:

let name = "Johnny Tuck" 
let pattern = Character("a")..."z" 
let maskedName = String(name.characters.map { pattern ~= $0 ? Character("*") : $0 }) 
print(maskedName) // J***** T*** 

如果目的不是通過*替換小寫字符而是掩模不在所有字符第一個給定單詞(例如,特定分隔符" "),可以用分隔符分隔String名稱,並對除所有分隔的單詞(子名稱)的首字符以外的所有單詞應用掩碼,最後依次爲重建蒙面字符串:

import Foundation 
let name = "johnny lucky tuck" 
let maskedName = name.components(separatedBy: " ") 
    .filter { !$0.isEmpty }.map { $0.characters } 
    .map { String($0.first!).uppercased() + String(repeating: "*", count: $0.dropFirst(1).count) } 
    .joined(separator: " ") 
print(maskedName) // J***** L**** T*** 

注意上面的uppercased(),它將初始非屏蔽字母設置爲大寫字母(即使它最初不是)。如果您不希望這種大小寫,只需刪除上面的.uppercased()電話。

+0

很好的地圖演示。 – Fluidity

+2

如果第一個字符是小寫字母,它將無法正常工作,對吧?儘管如此, –

+1

不適用於變音符號。 – Sulthan

3

一個非常簡單的解決方案:

(拆分單詞,過濾掉空的話,指數的每一個字符的話,地圖星,再次加入到全名)

let fullname = "This Is My Name" 

let result = fullname 
    .components(separatedBy: CharacterSet.whitespaces) 
    .filter { !$0.isEmpty } 
    .map { (name: String) in 
     let mappedCharacters = name.characters.enumerated().map { (index, letter) in 
      return (index == 0) ? letter : "*" 
     } 

     return String(mappedCharacters) 
    } 
    .joined(separator: " ") 

print("Result:", result) // Result: T*** I* M* N*** 
1

如果你的目的是用星號來代替除了在每個單詞的首每個字符,那麼這將 是另一種可能的解決方案:

extension String { 
    /// Replace all characters except the first by a star. 
    func starredWord() -> String { 
     return String(characters.prefix(1) + characters.dropFirst().map { _ in "*" }) 
    } 

    /// Star every "word" in a string. 
    func starred() -> String { 
     var result = "" 
     self.enumerateSubstrings(in: startIndex..<endIndex, options: .byWords) { 
      (s, range, enclosingRange, _) in 
      result += 
       // Append the substring preceeding the word ... 
       self[enclosingRange.lowerBound..<range.lowerBound] 
       // ... the starred word ... 
       + (s?.starredWord() ?? "") 
       // ... and the substring following the word. 
       + self[range.upperBound..<enclosingRange.upperBound] 
     } 
     return result 
    } 
} 

這裏enumerateSubstrings.byWords選項一起使用到 檢測當前語言環境中的單詞,即使它們由 標點符號分隔。

例子:

let name = "John M. Doe, sen." 
print(name.starred()) 
// J*** M. D**, s**.