我使用下面的代码来屏蔽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" }
我应该如何纠正我的正则表达式来处理这个问题?
3条答案
按热度按时间az31mfrm1#
添加的模式
|(?<=Name1\":\)(.+?)"
匹配Name1少于5个字符的情况。.+?
表示一个或多个字符。w1e3prcc2#
如果像这样修改正则表达式,就可以解决这个问题
(?<=Name1\":\")([^"]{1,5})(.*?)
.
匹配任何字符[^"]
匹配除"
之外的所有内容。因此它将在名称后的"
处停止。选定的组(
$1
)可以有1..5个字符。如果
Name1
是""
,那么输出中也是""
。顺便说一句:你对“通过”也有同样的问题。
你的代码看起来应该是这样的:
Look at regex101
7xzttuei3#
屏蔽value的前5个字符,如果value小于5个字符,仍然替换为5个字符的常量。OP希望在稍后阶段为Json和XML完成此操作。
通过注解可以清楚地看到,OP实际上是在寻找替换XML-string中值的前5个字符。因此,请尝试:
查看在线demo
(?<=
-打开正向后看;(?:Name1|pass)
-与“Name 1”或“pass”字面匹配的非捕获组;>[^<]{0,4})
-在我们关闭lookbehind之前匹配一个文字'〉'和0-4个字符而不是'〈';[^<]
-匹配除'|'以外的单个字符。同样的技术可以应用于Json-string:
或者,稍微不那么严格,但现在可能已经足够好了,两种选择的混合: