首页 > 解决方案 > 用于屏蔽数据的正则表达式

问题描述

我正在尝试为敏感数据的 JSON 响应实现正则表达式。

JSON 响应带有 AccountNumber 和 AccountName。

掩蔽细节如下。

accountNumber Before: 7835673653678365
accountNumber Masked: 783567365367****

accountName Before : chris hemsworth
accountName Masked : chri* *********

如果我只是这样做,我可以匹配上面的[0-9]{12}内容(?![0-9]{12}),当我替换它时,它只替换为 *,但我的正则表达式没有产生正确的输出。

如何从正则表达式生成上述输出?

标签: regexreplace

解决方案


如果你[0-9]{12}直接用一个星号匹配并替换它,你就剩下accountNumber Before: *8365

没有列出编程语言,但是替换末尾数字的一种选择是使用正向后视来断言左侧是 12 位,然后是正向前瞻来断言右侧是 0+ 数字在字符串的末尾。

然后在更换使用*

如果 json 的值与以下 2 个表达式的值完全相同,则chris hemsworth可以7835673653678365省略正向前瞻(?=\d*$)(?=[\w ]*$)断言字符串的结尾。

如果要匹配的数据位于字符串的末尾并且字符串包含更多数据,则使用具有正向前瞻的版本,这样您就不会替换比预期更多的匹配项。

(?<=[0-9]{12})(?=\d*$)\d

在 Java 中:

(?<=[0-9]{12})(?=\\d*$)\\d
  • (?<=[0-9]{12})正面向后看,断言左边是 12 位数字
  • (?=\d*$)正向前瞻,断言右边是 0+ 位并断言字符串的结尾
  • \d匹配单个数字

正则表达式演示

结果:

783567365367****

对于帐户名称,您可以使用 4 个单词字符来执行此操作,\w但这也会用星号替换空格,因为我相信您不能在一个正则表达式中跳过匹配该空格。

(?<=[\w ]{5})(?=[\w ]*$)[\w ]

在 Java 中

(?<=[\\w ]{4})(?=[\\w ]*$)[\\w ]

正则表达式演示

结果

克里斯***********


推荐阅读