Swift iOS Маска строки «Hello» для «Hxxxo» - PullRequest
6 голосов
/ 03 мая 2020
extension String {
    var masked: String {
        // some logic which I have to write to mask string.

        // I tried following and just shows x ?‍♂️
        // replacingOccurrences(
        //      of: ".(.+).", 
        //      with: "x", 
        //      options: .regularExpression, 
        //      range: nil
        //)
    }
}
let helloWorld = "Hello World"
print("Masked string is - \(helloWorld.masked)")

Ожидаемый результат - "Hxxxxxxxxxd"

Ответы [ 5 ]

7 голосов
/ 03 мая 2020

Существует способ регулярного выражения с lookaround

extension String {
    var masked: String {
        replacingOccurrences(
            of: "(?!^).(?!$)", // RegEx
            with: "x", // Replacement
            options: .regularExpression // Option to set RegEx
        )
    }
}
3 голосов
/ 03 мая 2020
extension Sequence {
  func replacingEachInteriorElement(with replacement: Element) -> [Element] {
    let prefix = dropLast()
    return
      prefix.prefix(1)
      + prefix.dropFirst().map { _ in replacement }
      + suffix(1)
  }
}
extension String {
  var masked: Self {
    .init( replacingEachInteriorElement(with: "x") )
  }
}
"Hello World".masked == "Hxxxxxxxxxd" // true
"H???????‍♂️??d".masked == "Hello World".masked // true
"?".masked // ?
"??".masked // ??
[].replacingEachInteriorElement(with: 500) // []
3 голосов
/ 03 мая 2020

Вы можете перечислить строку и применить преобразование карты, чтобы получить ожидаемый результат:

extension String {
  var masked: String {
    self.enumerated().map({ (index, ch) in
      if index == 0
        || index == self.count - 1 {
        return String(ch)
      }
      return "x"
    }).joined()
  }
}

let str = "hello"
print("after masking \(str.masked)") // Output - hxxxo

Преобразование карты вернет массив, поэтому используйте joined(), чтобы преобразовать массив обратно в строку. Кроме того, обратите внимание, что вы должны типизировать ch для String как String(ch), потому что типом ch является «String.Element» (он же «Символ»).

2 голосов
/ 03 мая 2020

Мое решение без использования регулярных выражений:

extension String {
    var masked: String {
        if self.count < 2 { return self }

        var output = self

        let range = self.index(after: self.startIndex)..<self.index(before: endIndex)

        let replacement = String.init(repeating: "x", count: output.count - 2)

        output.replaceSubrange(range, with: replacement)

        return output
    }
}
1 голос
/ 03 мая 2020

Пока что я нашел следующее решение.

extension String {
    var masked: String {
        var newString = ""
        for index in 0..<count {
            if index != 0 && index != count-1 {
                newString.append(contentsOf: "x")
            } else {
                let array = Array(self)
                let char = array[index]
                let string = String(char)
                newString.append(string)
            }
        }
        return newString
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...