掩盖所有数字,但最后四个

时间:2013-11-15 11:36:49

标签: regex

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

例如

ExtnTinNo =“1234567891234567”

Regex = (ExtnTinNo =)([“'] [^”'] \ d {12})

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

3 个答案:

答案 0 :(得分:2)

这应该捕获你想要的东西:

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

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

<强>故障:

(ExtnTinNo=)匹配ExtnTinNo =显然

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

(["'][^"']*?)匹配中间的所有内容,即“或”后跟要掩盖的数字

答案 1 :(得分:2)

我假设你要转换这样的文字:

ExtnTinNo="1234567891234567"
ExtnTinNo="12345678912345678912345"

这样的事情:

ExtnTinNo="****4567"
ExtnTinNo="****2345"

如果是这样,您应该尝试以下正则表达式:

(?<=ExtnTinNo=['"])\d{12,}(?=[\d]{4}["'])

这将匹配您的号码中的所有数字,除了最后的4位。这意味着,它将匹配以下内容:

ExtnTinNo="1234567891234567"
           ^^^^^^^^^^^^
ExtnTinNo="12345678912345678912345"
           ^^^^^^^^^^^^^^^^^^^

只需使用Regex替换,您将得到上面给出的结果。

它的工作原理如下:

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

答案 2 :(得分:0)

考虑以下Regex ......

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

祝你好运!