用于屏蔽数据的正则表达式

时间:2019-05-01 15:41:06

标签: regex replace

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

JSON响应带有AccountNumber和AccountName。

详细信息如下。

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

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

如果我只做[0-9]{12}(?![0-9]{12}),我就能在上面进行匹配,当我替换它时,它仅替换为*,但是我的正则表达式无法产生正确的输出。

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

2 个答案:

答案 0 :(得分:2)

如果您匹配[0-9]{12}并将其直接替换为一个星号,则剩下accountNumber Before: *8365

没有列出编程语言,但是最后一种替换数字的方法是在后面使用正向后断言来断定左边的12位数字,然后用正向向前断言来断言右边的是0。 +数字,后跟字符串的结尾。

然后在替换中使用*

如果json的值与chris hemsworth7835673653678365的值完全相同,则可以省略肯定的前行(?=\d*$)(?=[\w ]*$),它们断言了字符串的结尾以下2个表达式。

如果要匹配的数据位于字符串的末尾,并且字符串包含更多数据,请使用正向查找的版本。因此,您替换的匹配项不会超出您的预期。

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

在Java中:

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

Regex demo

结果:

  

783567365367 ****

对于帐户名,您可以使用4个单词字符\w来实现,但这也会用星号代替空格,因为我相信您不能跳过在一个正则表达式中匹配该空格的情况。

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

在Java中

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

Regex demo

结果

  

chri ***********

答案 1 :(得分:0)

如果只想掩盖除前N个字符外的所有字符,请不要认为您真的是一个复杂的正则表达式。要忽略前N个字符并用*之后的每个字符替换,您可以编写这样的通用正则表达式,

(?<=.{N}).

其中N可以是任何数字,例如1,2,3等,并将匹配项替换为*

此正则表达式的工作方式是,它选择每个字符之前至少包含N个字符,因此一旦选择了一个字符,随后的所有字符也会被选中。

例如,在您的AccountNumber情况下,N = 12,因此您的正则表达式变为

(?<=.{12}).

Regex Demo for AccountNumber masking

Java代码

String s = "7835673653678365";
System.out.println(s.replaceAll("(?<=.{12}).", "*"));

打印

783567365367****

对于AccountName情况,N = 4,因此您的正则表达式变为

(?<=.{4}).

Regex Demo for AccountName masking

Java代码

String s = "chris hemsworth";
System.out.println(s.replaceAll("(?<=.{4}).", "*"));

打印

chri***********