【问题标题】:Masking of all digits but last four屏蔽除最后四位以外的所有数字
【发布时间】:2013-11-15 11:36:49
【问题描述】:

我必须将日志文件中的字段值屏蔽到最后四位。问题是数字的长度不固定。它可以是 16 位或更多。

例如

ExtnTinNo="1234567891234567"

正则表达式 = (ExtnTinNo=)(["'][^"']\d{12})

它工作正常,但是当它超过 16 位时,未屏蔽的数字将超过 4。另外,如果有空格 b/w feild,= 和 value ,它会失败

【问题讨论】:

  • 您使用什么语言/工具进行此屏蔽?

标签: regex


【解决方案1】:

这应该捕获你想要的:

(ExtnTinNo=)(["'][^"']*?)\d{4}["']

我不确定你应该在组中捕获什么,所以我将它们保留在你原来的正则表达式中。第 1 组匹配 'EXTnTinNo=',第 2 组匹配引号后跟要屏蔽的数字。

细分:

(ExtnTinNo=) 显然匹配 ExtnTinNo=

\d{4}["'] 匹配结尾 " 或 ' 之前的最后 4 位数字

(["'][^"']*?) 匹配两者之间的所有内容,即 ' 或 " 后跟要屏蔽的数字

【讨论】:

    【解决方案2】:

    我假设你想像这样转换文本:

    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,点击“上下文”标签查看替换后的结果)

    【讨论】:

      【解决方案3】:

      考虑以下正则表达式...

      (?<=(ExtnTinNo=)(["'][^"']*?))\d{4}(?=["'])
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 2017-07-03
        • 2015-09-09
        • 1970-01-01
        相关资源
        最近更新 更多