【问题标题】:Java, Regex: Replace fields in Json by field keyJava,Regex:用字段键替换 Json 中的字段
【发布时间】:2018-03-07 16:29:08
【问题描述】:

要求:

对于键匹配指定常量的每个 Json 字段,将值替换为另一个常量。

{"regular":"a", "sensitive":"b"}

参数“敏感”、“*****”。 预期:

{"regular":"a", "sensitive":"*****"}

值可能有也可能没有双引号。替换常数总是双引号。 Json 可能格式不正确。最好是Java实现。

键比较不区分大小写。

【问题讨论】:

  • 使用正则表达式操作 JSON 不是一个好主意。使用一些 JSON 库
  • @TheLostMind 我要求 Json 可能格式不正确。
  • 嗯。好吧,在那种情况下,有办法实现这一点。尽管我已经为此添加了答案,但我强烈建议避免使用它

标签: java regex


【解决方案1】:

根据您的“JSON”的格式错误,以下方法可能有效 - 如果无效,我们需要更多测试用例:

"sensitive"\s*:\s*  # match "sensitive":
(                   # capture in group 1:
 "[^"]*"            # any quoted value
|                   # or
 [^\s,{}"]*         # any unquoted value, ending at a comma, brace or whitespace
)                   # end of group 1

在 Java 中:

String resultString = subjectString.replaceAll(
    "(?x)\"sensitive\"\\s*:\\s* # match \"sensitive\":\n" +
    "(                          # capture in group 1:\n" +
    " \"[^\"]*\"                # any quoted value\n" +
    "|                          # or\n" +
    " [^\\s,{}\"]*              # an unquoted value, ending at comma, brace or whitespace\n" +
    ")                          # end of group 1",
    "\"sensitive\":\"******\"");

测试它live on regex101.com

【讨论】:

    【解决方案2】:

    您可以使用 positive lookbehind 来实现此目的:

    public static void main(String[] args) {
        String s = "{\"regular\":\"a\", \"sensitive\":\"b\"}";
        String key = "sensitive";
        String val = "****";
        System.out.println(s.replaceAll("(?<=\"" + key + "\":\")(\\w+)", val));
         key = "regular";
        System.out.println(s.replaceAll("(?<=\"" + key + "\":\")(\\w+)", val));
    
    }
    

    O/P:

    {"regular":"a", "sensitive":"****"}
    {"regular":"****", "sensitive":"b"}
    

    【讨论】:

    • 如何使键比较不区分大小写?
    • 使用 (?i) 进行不区分大小写的匹配
    【解决方案3】:

    您可以使用以下正则表达式:

    String t= "{\"regular\":\"a\", \"sensitive\":\"b\"}"; //{"regular":"a", "sensitive":"b"}
    String r = t.replaceAll("(\\s*)\"?sensitive\"?\\s*:\\s*\"?b\"?\\s*", "$1\"sensitive\":\"*****\""); 
    System.out.println("output "+r); //output {"regular":"a", "sensitive":"*****"}
    
    t= "{\"regular\":\"a\",sensitive:b}"; //{"regular":"a", "sensitive":"b"}
    r = t.replaceAll("(\\s*)\"?sensitive\"?\\s*:\\s*\"?b\"?\\s*", "$1\"sensitive\":\"*****\""); 
    System.out.println("output "+r); //output {"regular":"a","sensitive":"*****"}
    

    演示:https://regex101.com/r/uHUhEl/1/

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 2015-08-20
      • 2016-05-02
      • 2013-05-11
      • 2021-05-26
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多