开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-数据脱敏-手机号码脱敏代码】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11648
数据预处理-数据脱敏-手机号码脱敏代码
实现手机号码脱敏这个过程
首先获取一个手机号码的正则表达式。接下来匹配出这个数据,使用正则表达式获取出有可能是手机号码的数据,做一个接收,先定义一个临时的接收数据的变量定义,这个变量就用它来接收的 message,这里面定一个变量,然后就叫 encrypted,val 一个 encrypted,就叫 encryptedDate 等于 message 数据进行临时接受一下,用正则表的是来匹配 encryptedDate 数据,然后来正则表达式 phonePattern.Matcher(encryptedDate)不做处理,直接将这里面有可能是数据有可能是手机号的所有的数据都匹配出来,进行一个接收 val,定义 phones,因为它可能会匹配出多个数据,所以加个 s,判断它一定是手机号,假设匹配上多个,遍历每一个可能是手机号的数据,使用 while 先找到手机号,再过滤出来。但是这个时候的手机号还不一定是手机号,要过滤出一个可能是手机号的数据,phone=phones.group 就拿到了手机号码
判断是不是一个手机号的方法:前一个位置不是数字,后面没有数据;或者前一个位置不是数字,手机号的后一个位置也不是数字,这两种情况它一定是手机号。就要拿取手机号前一个位置的字符和后一个位置的字符。得先找到前一个位置的角标和后一个位置的角标,后一个位置角标。
获取到手机号码首位数字,前一位的 index。即:
//获收到手机号码首位数字前一位的index
valbefIndex=encryptedData.indexof(phon)-1
//获取到下机号码最后一位数字后面一位的index
valaftIndex-encryptedData.indexof(phone)+11
同理获得手机号码最后一位数字。角标有了,要位置的值,前一个位置它不是数字,要字符。获取字符就获取它这里面 encryptedDate 这个数据,插 at,传进角标,就是角标对应的数据字符。定一个变量来进行接收,valbefLetter 叫前面这个数据当中位置的字符,同理可得后一个位置的字符,如下:
//获收到手机号码首位教字前一位的字符
valbefLetter=encrypteData.charAt(befIndex)
//获取到手机号码最后一位数字后面一位的字符
valaftletter=encryptedData.charAt(aftIndex)
第一步判断一定是手机号码的数据。手机号码前一个位置不是数字且手机号码是最后一条数据,如果if手机号码前一个位置不是数字,用 befLetter.match,没有 match。先转化成 tostring,再.matches 后转化成数字的0~9的正则表达式,也就是说前面那个位置的字母,匹配数字没有匹配上,就不是数字。
后一个位置判断数据已经到了最后一位,假设后一个位置的角标长度是18,后面加了一个1是19,就用前面算出来的手机号码最后一位数字后面一位的角标大小大于这个字符串的长度就行。
如果的手机号码的后一个位置的角标 aftIndex 要不要大于 encryptedDate.若手机号的最后一位,后面的角标大于数据的总长度,那么表示这个数据这个手机号是数据的最后一位如下:
valbefLetter=encryptedData.charAt(befIndex).tostring
//获取到手机号码最后一位数字后面一位的字符
ValaftLetter=encryptedData.charAt(aftIndex).tostring
//3判断出一定是手机号的数据
//3-1手机号码前一个位置不是数字,并且手机号码是一条数据中的最后一个数据,那么表示这个一定是手机号
if(!befLetter.matches(regex=“^[0-9]$")){
//若手机号的最后一位后面的角标大于数据的总长度那么表示这个手机号是数据的最后一位
if(aftIndex>encryptedData.length){
确定手机号后对数据进行加密,手机号加密完了以后去替换原始数据。原始数据 encryptedDate 等于encryptedDate.数据替换 replace.Old 的在前面,新的在后面 old 是手机号。
手机号加密的方法提供有 util 里面有 decode,里面有一个 MD5方法就是用来做手机号码加密的,直接用。先把 Md5进行实例,如下:
//用于实现手机号码的脱敏实现
def encryptedPhone(message: string) :Unit= {
//定义临时接受数据的变量
var encryptedData=message
//实例MD5
val md5=new MD5()
调用 MD5里面的方法。这个数据是要加密的数据,这里面也就是的手机号,如下:
if (aftIndex>encryptedData. length){
//确定出是手机号后, 将手机号加密,替换原始的数据
encryptedData=encryptedData. replace(phone , md5.
getMD5ofstr(phone))
替换完以后返回 encryptedDate 这个数据。以上第一种情况,手机号码前一位不是数字,并且手机号的后一位它是最后一个数据。
第二种情况叫做手机号码的前一位不是数字,后一位也不是数字,如 abc18611577667def,就一定是手机号码。
第二步在判断条件的基础之上,前一位不是数字,已经判断了,后面一个位置角标大于数据的长度,就是最后一位,else 表示数据不是最后一位。前面一位不是数字已经判断了,而后一位也不是数字的判断方法,思路是一样的。如果手机号码的后一位的字符它不是数字,依然是这个数字的正则,那就代表了他后一位也不是数字,代码如下:
if( !aftletter. matches( regex = "^[0-9]$")){
前面不是数字,后面不是数字,它一定是手机号,一定是手机号,那么就继续来进行替换就可以了。继续替换,替换完以后脱敏工作做完了。这里面有一个点需要引一下,看获取手机号码的最后一位的角标,如果这个手机号码假设说它是最后一位,手机号码是最后一个数据这种情况,后面一位是角标可以得到,因为是加出来的数字可以拿到,但是如果是最后一位,通过最后一位的角标去拿取 charat,拿不到这个数据,拿不到就会报错。所以要把它换个位置,换到 else 里面来。也就是在 else 里面,如果不是最后一位 else,就用手机号码最后一个位置后面的字母。
这就是实现数据脱敏的手机号码脱敏的一个过程。