การ์ดเบอร์แกล้งทำ[ปิด]

0

คำถาม

ฉันกำลังพยายามหน้ากากบัตรอเบอร์กับ regex. ก่อน 6 และเมื่อ 2 chars สามารถจะแสดงให้เห็นอีกควรจะ"*".

let cardNumber: String = "5890040000000016"

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

ฉันต้องทำยังอยู่ในรี?

masking swift
2021-11-17 13:33:24
3

คำตอบที่ดีที่สุด

1

คำถามของคุณมี 2 ส่วนสำคัญ:

เป็น regex นั่นตรงกับทุกตัวอักษรแต่แรก 6 คนและสุดท้าย 2

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

แล้ว

ขอเลื่อนส่ง String นั่นต้องใช้ค regex และหน้ากากมัน:

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

2021-11-17 14:32:06

อาจจะดูดีกว่าถ้าใช้ #"..."# มากกว่า "..." เพราะว่าน่ารำคาญของตัวละครหลบหนีจากสำหรับ regex
George

ฉันต้องมีขี่ม้าของมันน่าเกลียดหนีตลอด@จอร์จ ตอนนี้มันเป็นสะอาดเหมือนสวรรค์
Mojtaba Hosseini
1

คุณสามารถ concatenate substrings ด้วยกัน:

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
2021-11-17 14:21:43

มันอยู่ที่ไหน regex? :/
Mojtaba Hosseini

@MojtabaHosseini ไม่ใช่ regex แต่มัน achieves ผล(และจะถูกรวดเร็วเกินไป)
George

พูดดีนี่/n แต่อะไรที่เกี่ยวกับแมสซีฟไดนามิ regex?
Mojtaba Hosseini

ใช่ขอบคุณ@จอร์จ,นั่นมันเจ๋งมันทำงานแต่ฉันสงสัยว่าถ้าฉันสามารถทำมันกับ regex.
Kaan Ozdemir

@KaanOzdemir คุณกำลังจะต้องละเอียดของคุณความต้องการเพราะปัญหาของคุณเสนไม่มีเหตุผลที่จะแก้ปัญหากับ regex.
Alexander
0

บางทีคุณอาจจะกำลังมองหาบางอย่างเหมือนนี้:

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
}
2021-11-17 13:46:10

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................