我必须在日志文件中屏蔽feild的值,直到最后四位数。问题是数字长度不固定。它可以是16位或更多。
例如
ExtnTinNo =“1234567891234567”
Regex = (ExtnTinNo =)([“'] [^”'] \ d {12})
它工作正常,但是当它超过16位时,未屏蔽的数字将超过4.如果有空格b / w feild,=和value,它将失败
答案 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}(?=["'])
祝你好运!