regex 正则表达式JSON字符串掩码

q8l4jmvw  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(142)

我使用下面的代码来屏蔽JSON值的前5个字符,它按预期工作。

String s = "{ \"Name1\":\"Cristhoper David\", \"pass\":\"123456789123\" }";

System.out.println(s
        .replaceAll("(?<=Name1\":\")(.{1,5})(.*?)", "*****$2")
        .replaceAll("(?<=pass\":\")(.{1,5})(.*?)", "*****$2")
);

输出:

{ "Name1":"*****hoper David", "pass":"*****6789123" }

但是当Name1小于5个字符时,JSON变得不正确,",符号消失,如以下示例所示:

String s = "{ \"Name1\":\"Joe\", \"pass\":\"123456789123\" }";

System.out.println(s
        .replaceAll("(?<=Name1\":\")(.{1,5})(.*?)", "*****$2")
        .replaceAll("(?<=pass\":\")(.{1,5})(.*?)", "*****$2")
);

输出:

{ "Name1":"***** "pass":"*****6789123" }

这里",被删除了。
还有下面的

String s = "{ \"Name1\":\"Jo\", \"pass\":\"123456789123\" }";

System.out.println(s
        .replaceAll("(?<=Name1\":\")(.{1,5})(.*?)", "*****$2")
        .replaceAll("(?<=pass\":\")(.{1,5})(.*?)", "*****$2")
);

输出:

{ "Name1":"*****"pass":"*****6789123" }

如果Name1小于5个字符,我希望它是

{ "Name1":"*****","pass":"*****6789123" }

我应该如何纠正我的正则表达式来处理这个问题?

az31mfrm

az31mfrm1#

添加的模式|(?<=Name1\":\)(.+?)"匹配Name1少于5个字符的情况。.+?表示一个或多个字符。

w1e3prcc

w1e3prcc2#

如果像这样修改正则表达式,就可以解决这个问题
(?<=Name1\":\")([^"]{1,5})(.*?)

  • .匹配任何字符
  • [^"]匹配除"之外的所有内容。因此它将在名称后的"处停止。

选定的组($1)可以有1..5个字符。
如果Name1"",那么输出中也是""
顺便说一句:你对“通过”也有同样的问题。
你的代码看起来应该是这样的:

System.out.println(s.
                   replaceAll("(?<=Name1\":\")([^\"]{1,5})(.*?)", "*****$2").
                   replaceAll("(?<=pass\":\")([^\"]{1,5})(.*?)",  "*****$2")
                  );

Look at regex101

7xzttuei

7xzttuei3#

  • 初始问题:*

屏蔽value的前5个字符,如果value小于5个字符,仍然替换为5个字符的常量。OP希望在稍后阶段为JsonXML完成此操作。

  • 实际问题:*

通过注解可以清楚地看到,OP实际上是在寻找替换XML-string中值的前5个字符。因此,请尝试:

(?<=<(?:Name1|pass)>[^<]{0,4})[^<]

查看在线demo

  • (?<=-打开正向后看;
  • (?:Name1|pass)-与“Name 1”或“pass”字面匹配的非捕获组;
  • >[^<]{0,4})-在我们关闭lookbehind之前匹配一个文字'〉'和0-4个字符而不是'〈';
  • [^<]-匹配除'|'以外的单个字符。

同样的技术可以应用于Json-string:

(?<=\"(?:Name1|pass)\":\"[^\"]{0,4})[^\"]

或者,稍微不那么严格,但现在可能已经足够好了,两种选择的混合:

(?<=[<\"](?:Name1|pass)(?:>|\":\")[^<\"]{0,4})[^<\"]

相关问题