2015-03-28 13 views
5

Cho một chuỗi đại diện cho một số thẻ tín dụng ...Scala: Làm thế nào để mặt nạ các nhân vật N đầu tiên của một chuỗi

val creditCardNo = "1111222233334444" 

... làm thế nào để mặt nạ trong 12 ký tự đầu tiên với *?

val maskedCreditCardNo = "************4444" 
+2

Đó là một sự xấu hổ mà som-snytt đã không làm cho 'patch' bình luận của mình một câu trả lời, vì đó là một giải pháp thành ngữ hơn nhiều so với biểu thức chính quy (mà thậm chí không giải quyết vấn đề như đã nêu trong tiêu đề). –

Trả lời

6

Thay thế tất cả những biểu tượng chữ số trừ 4 ký tự vẫn:

creditCardNo.replaceAll("\\d(?=\\d{4})", "*") 
14

Chỉ cần sử dụng drop hoặc substring về số lượng ban đầu, và thêm vào trước các số bên phải của "*":

"*" * 12 + (creditCardNo drop 12) 
+10

Thành ngữ, 'ns.patch (0," * "* 12, 12)'. –

1

Cách tiếp cận nơi bạn có thể sửa đổi các giá trị ký tự cho từng vị trí, trong trường hợp này, trước vị trí 12,

creditCardNo.zipWithIndex.map (c => if (c._2 < 12) '*' else c._1).mkString 

Lưu ý rằng mặc dù khả năng thay đổi từng vị trí riêng lẻ, đây không phải là cách hiệu quả nhất để thao tác chuỗi.

Các vấn đề liên quan