【问题标题】:Masking First and Last Name String with *用 * 屏蔽名字和姓氏字符串
【发布时间】:2016-12-19 23:16:44
【问题描述】:

我有一个由名字和姓氏组合而成的字符串:

约翰尼·塔克

我想像在 Swift 3 中那样屏蔽该字符串:

J***** T***

我该怎么做?

【问题讨论】:

  • 请展示您的尝试。
  • 如果有中间名(可以缩写也可以不缩写)怎么办?中文等外文名称呢?
  • @shallowThought 如果你不知道从哪里开始,就很难展示一些东西。 @mTuran 这是一个很酷的问题:)

标签: swift swift3


【解决方案1】:

你可以例如对小写字符使用模式匹配并将匹配模式的字符替换为星号字符 (*):

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

如果目的不是用* 替换小写字符,而是屏蔽不是给定单词的第一个字符的所有字符(例如,特定的分隔符" "),您可以分隔@ 987654325@ 名称由分隔符,并对所有分隔的单词(子名称)的初始字符以外的所有字符应用掩码,然后最终重建掩码字符串:

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() 调用即可。

【讨论】:

  • 如果第一个字符是小写字母就不行了,对吧?
  • 另一种方法是将字符串拆分,将第一个字母大写,然后将它们加注星号。您可以使用 String @AhmadF NSString 和 @987654331 的内置方法来做到这一点@(以前的 NSCharacter)也有扩展的字符串方法
【解决方案2】:

一个非常简单的解决方案:

(拆分成单词,过滤掉空词,索引单词中的每个字符,映射到星,再次加入全名)

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***

【讨论】:

    【解决方案3】:

    如果您的意图是将每个单词中除第一个字符之外的每个字符替换为星号,那么这将 是另一种可能的解决方案:

    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**.
    

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2020-12-01
      • 1970-01-01
      • 2016-11-11
      相关资源
      最近更新 更多