如何在JSON字符串中正确应用已有的电子邮件掩码正则表达式?
解决JSON字符串中邮箱掩码正则失效的问题
问题原因
你原有的正则(?<=.{1})(?=[a-zA-Z0-9]).(?=.*@)是针对单独的邮箱字符串设计的,它通过反向断言匹配邮箱首字符后的位置,正向断言锁定@之前的字符范围。但直接用它扫描整个JSON字符串时,邮箱被包裹在字段名、引号等上下文里(比如"email": "test.ing%02@gmail.com"),原正则的断言逻辑会被这些额外的上下文干扰,无法正确定位到邮箱内部需要替换的字符,导致匹配失效。
解决方案
方案1:解析JSON后处理字段(推荐)
先把JSON字符串解析为结构化数据(比如字典),单独处理每个邮箱字段,再重新序列化为JSON。这种方法不受JSON结构复杂度影响,可靠性最高。
以Python为例:
import json import re # 定义邮箱掩码函数 def mask_single_email(email): return re.sub(r'(?<=.{1})(?=[a-zA-Z0-9]).(?=.*@)', '*', email) # 原始JSON字符串 raw_json = '{"username": "testuser", "email": "test.ing%02@gmail.com", "backup_email": "abc123@outlook.com"}' # 解析为字典 data = json.loads(raw_json) # 遍历所有字段,处理含"email"的字段 for key, value in data.items(): if 'email' in key.lower() and isinstance(value, str): data[key] = mask_single_email(value) # 重新生成掩码后的JSON masked_json = json.dumps(data) print(masked_json)
输出结果:{"username": "testuser", "email": "t***.***%**@gmail.com", "backup_email": "a****@outlook.com"}
方案2:正则匹配JSON中的邮箱字段(适合简单场景)
如果你的JSON结构简单(无嵌套对象、数组,无转义引号),可以用正则先匹配到所有邮箱字段的键值对,再对捕获的邮箱内容应用掩码。
以Python为例:
import re def mask_email_callback(match_obj): # 捕获字段名和原始邮箱 field_name = match_obj.group(1) raw_email = match_obj.group(2) # 应用掩码正则 masked_email = re.sub(r'(?<=.{1})(?=[a-zA-Z0-9]).(?=.*@)', '*', raw_email) # 拼接回键值对格式 return f'"{field_name}": "{masked_email}"' raw_json = '{"username": "testuser", "email": "test.ing%02@gmail.com", "backup_email": "abc123@outlook.com"}' masked_json = re.sub(r'"(\w*email\w*)": "([^"]+)"', mask_email_callback, raw_json) print(masked_json)
注意:如果JSON存在嵌套结构、转义字符或者字段值包含双引号,这种方法会出错,优先用方案1。
内容的提问来源于stack exchange,提问作者tyb9900
相关产品推荐
相关产品推荐

