我必须屏蔽日志文件中的字段值,直到最后四位数字。问题是数字长度不固定。可以是 16 位或更多。
例如
ExtnTinNo="1234567891234567"
正则表达式 = (ExtnTinNo=)(["'][^"']\d{12})
它工作正常,但是当它超过 16 位数字时,未屏蔽的数字将超过 4。此外,如果存在空格 b/w feild,= 和 value ,则会失败
最佳答案
我假设您想要像这样转换文本:
ExtnTinNo="1234567891234567"
ExtnTinNo="12345678912345678912345"
像这样:
ExtnTinNo="****4567"
ExtnTinNo="****2345"
如果是这样,您应该尝试以下正则表达式:
(?<=ExtnTinNo=['"])\d{12,}(?=[\d]{4}["'])
这将匹配您号码中的所有数字(最后 4 位除外)。这意味着它将匹配以下内容:
ExtnTinNo="1234567891234567"
^^^^^^^^^^^^
ExtnTinNo="12345678912345678912345"
^^^^^^^^^^^^^^^^^^^
通过简单地使用正则表达式替换,您将得到上面给出的结果。
它的工作原理是这样的:
(?<=ExtnTinNo=['"]) - checks that the number is preceded by ExtnTinNo="
(not included in the match)
\d{12,} - matches 12 or more numbers
(?=[\d]{4}["']) - if these 12 numbers are followed by another 4 numbers
and a " or ' (not included in the match)
请注意,这并不能解决您的空格问题!根据您的正则表达式引擎,您甚至可以在 =
周围添加可选的空格。然而,并非所有引擎都支持可变长度的后视!例如,在 .NET 中应该可以使用这个:
(?<=ExtnTinNo\s*=\s*['"])\d{12,}(?=[\d]{4}["'])
(参见demo here,点击“Context”选项卡查看替换后的结果)
关于regex - 屏蔽除最后四位之外的所有数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20000221/