【问题标题】:Card Number Masking [closed]卡号掩蔽[关闭]
【发布时间】:2021-12-28 11:40:06
【问题描述】:

我正在尝试使用正则表达式来掩盖卡号。 前 6 个和后 2 个字符可以显示为“*”。

let cardNumber: String = "5890040000000016"

print("Output: ", cardNumber.mask(regexPattern:"XXXXXXX")) // Output: 589004********16

我怎样才能快速做到这一点?

【问题讨论】:

  • 没有mask 方法,"XXXXXXX" 不是“正则表达式模式”,因此您的代码毫无意义。如果有我们看不到的东西,请展示出来。
  • 让我解释一下@matt。我想用正则表达式屏蔽一个卡号。我需要一个可以检测前 6 个和后 2 个字符之间的正则表达式。我不知道是否有这样的正则表达式。这就是为什么它是XXXXXX。我只是想知道。
  • 已经检查过了。 @MartinR
  • 是的,您可以创建一个正则表达式来做到这一点。但是既然这可以在没有正则表达式的情况下轻松完成,为什么你“需要”一个正则表达式?这只是一个无聊的好奇心问题吗?我再次问,无意义的代码是做什么用的?如果因为你定义了mask(regexPattern:) 方法而有意义,请显示该方法。

标签: swift masking


【解决方案1】:

您可以将子字符串连接在一起:

let cardNumber = "5890040000000016"

let start = cardNumber.startIndex ..< cardNumber.index(cardNumber.startIndex, offsetBy: 6)
let end = cardNumber.index(cardNumber.endIndex, offsetBy: -2) ..< cardNumber.endIndex
let result = cardNumber[start] + Array(repeating: "*", count: cardNumber.count - 8) + cardNumber[end]
print(result)

// Prints: 589004********16

【讨论】:

  • 正则表达式在哪里? ://
  • @MojtabaHosseini 不是正则表达式,但它实现了结果(并且会更快)
  • 好点,但是动态正则表达式呢?
  • 是的,谢谢@George,这很酷,但我想知道我是否可以使用正则表达式来做到这一点。
  • @KaanOzdemir 你需要详细说明你的要求,因为你提出的问题用正则表达式解决是没有意义的。
【解决方案2】:

也许你正在寻找这样的东西:

let s = "5890040000000016"
let patt = ##"^(\d{6})(.*)(\d{2})$"## // this is your pattern
let reg = try! NSRegularExpression(pattern: patt, options: [])
if let m = reg.firstMatch(in: s, options: [], range: NSRange(s.startIndex..<s.endIndex, in: s)) {
    let r = m.range(at:2)
    let result = s.replacingCharacters(in: Range(r, in:s)!, with: String(repeating: "X", count: r.length))
    print(result) // 589004XXXXXXXX16
}

【讨论】:

    【解决方案3】:

    您的问题包含两个重要部分:

    匹配除前 6 个和后 2 个以外的所有字符的正则表达式

    let regexPattern = "(?<=.{6}).(?=.*.{2}$)"
    

    String 上的扩展,它采用正则表达式并将其屏蔽:

    extension String {
    
        func masked(matching regexPattern: String, with template: String = "*") throws -> String {
            let regex = try NSRegularExpression(pattern: regexPattern, options: NSRegularExpression.Options.caseInsensitive)
            let range = NSMakeRange(0, count)
            return regex.stringByReplacingMatches(in: self, options: [], range: range, withTemplate: template)
        }
    }
    

    用法:

    let cardNumber = "5890040000000016"
    let regexPattern = "(?<=.{6}).(?=.*.{2}$)"
    
    print("Output:", try! cardNumber.masked(matching: regexPattern))
    

    输出:589004********16

    【讨论】:

    • 使用#"..."# 比使用"..." 可能看起来更好,因为正则表达式的字符转义很烦人
    • 我已经摆脱了@George 那种丑陋的逃避。现在它像天堂一样干净
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 2021-11-25
    • 2018-07-29
    • 2017-12-07
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多