【问题标题】:Append using Regex Replace with repeating pattern使用正则表达式替换重复模式追加
【发布时间】:2021-07-17 08:36:09
【问题描述】:

我需要在我的 Java 程序中附加/替换以下模式。

示例字符串:

1: {\"values" : ["AnyValue1", "TestValue", "Dummy", "SomeValue"], "key" : "value"}

2: {\"otherValue\": \"AnyValue1\", \n" + "\"values\" : [\"AnyValue1\", \"TestValue\", \"Dummy\", \"SomeValue\"], \"key\" : \"value\"}

此值数组中可以有N 个值。

我需要用_val 附加所有值。但是,只有values 中的值应该附加_val

Output 1: { "values" : ["AnyValue1_val", "TestValue_val", "Dummy_val", "SomeValue_val"], "key" : "value" }

Output 2: {"otherValue": "AnyValue1", 
          "values" : ["AnyValue1_val", "TestValue_val", "Dummy_val", "SomeValue_val"], "key" : "value"}

我想知道是否可以使用正则表达式替换而不是循环?

内容在字符串中:

String content = "{ \"values\" : [\"AnyValue1\", \"TestValue\", \"Dummy\", \"SomeValue\"], \"key\" : \"value\" }";

【问题讨论】:

  • 答案取决于您存储信息的方式。正则表达式可以应用于stringstexts如果你有一个字符串或一些文本 = { "values" : ["AnyValue1", "TestValue", "Dummy", "SomeValue"], "key" : "value" } 那么你可以对它应用正则表达式。但是,如果值存储在数组中,则需要先提取值,然后再对其进行任何操作。
  • 这被存储为字符串:字符串内容 = "{ \"values\" : [\"AnyValue1\", \"TestValue\", \"Dummy\", \"SomeValue\"] , \"key\" : \"value\" }";
  • 届时我将研究解决方案。

标签: java regex string replace regexp-replace


【解决方案1】:

替代方案:

public static void main(String[] args) {
    String input = "{ \"values\" : [\"AnyValue1\", \"TestValue\", \"Dummy\", \"SomeValue\"], \"key\" : \"value\" }";

    Matcher matcher = Pattern.compile("(.*?\\[)(.*?)(\\].*)").matcher(input);
    if(matcher.find()) {
        String val = matcher.group(2).replaceAll("(\\w+)", "$1_val");
        System.out.println(matcher.group(1) + val + matcher.group(3));
    }
}

输出:

{ "values" : ["AnyValue1_val", "TestValue_val", "Dummy_val", "SomeValue_val"], "key" : "value" }

【讨论】:

    【解决方案2】:

    试试这个。

    String content = "{ \"values\" : [\"AnyValue1\", \"TestValue\", \"Dummy\", \"SomeValue\"], \"key\" : \"value\" }";
    Pattern bracket = Pattern.compile("\\[.*?\\]");
    Pattern string = Pattern.compile("\"(.*?)\"");
    String result =  bracket.matcher(content)
        .replaceAll(m -> string.matcher(m.group())
            .replaceAll(n -> "\"" + n.group(1) + "_val\""));
    System.out.println(result);
    

    输出:

    { "values" : ["AnyValue1_val", "TestValue_val", "Dummy_val", "SomeValue_val"], "key" : "value" }
    

    【讨论】:

      【解决方案3】:

      我已经解决您的问题几分钟了。我想出了一个解决方案。这可能不是最好的,因为我不太习惯使用正则表达式。


      概念

      这是一个两步解决方案:

      1st step: Obtain the substring between [...] using regex.
      2nd step: Obtain all the substring between "..." and append "_val" in the end.
      

      之所以需要先获取[...]之间的子字符串,是因为如果我们直接应用第二步,那么“values”、“key”和“value”也会发生变化。这不是你想要的。


      代码

      //Set the string
      String str = "{\"otherValue\": \"AnyValue1\", \n" + "\"values\" : [\"AnyValue1\", \"TestValue\", \"Dummy\", \"SomeValue\"], \"key\" : \"value\"}";
      
      //Set the first pattern to find the substring between [...]
      Pattern pattern1 = Pattern.compile("(?<=\\[).*(?=])");
      Matcher matcher1 = pattern1.matcher(str);
      
      //To locate part of string not to replace
      int startIndex;
      int endIndex;
      
      if (matcher1.find())
      {
          String values = matcher1.group();
          startIndex = matcher1.start();
          endIndex = matcher1.end();
           
          //Set the first pattern to find all the substring between "..."
          Pattern pattern2 = Pattern.compile("(?<=\")[a-zA-z0-9]+(?=\")");
          Matcher matcher2 = pattern2.matcher(values);
      
          while (matcher2.find())
          {
              values = values.replace(matcher2.group(), matcher2.group()+"_val");
          }
      
          System.out.println(str.substring(0, startIndex) + values + str.substring(endIndex));
      }
      

      输出

      {"otherValue": "AnyValue1", 
      "values" : ["AnyValue1_val", "TestValue_val", "Dummy_val", "SomeValue_val"], "key" : "value"}
      

      希望我对你有所帮助。 java.util.regex.Patternjava.util.regex.Matcher 类中可能存在更好的方法,它们可能会以更简单的方式做事。也许他们可以在一个命令中替换所有子字符串。但是,我不经常使用这些类,所以我不熟悉它。

      如果您对所使用的正则表达式有任何疑问,请发表评论。

      PS:如果有人发现我的答案有任何改进,尤其是如果它可以变得更简单,请务必提及。我发现我目前的答案有点复杂。我认为它可以改进。

      【讨论】:

      • 如果在字符串的其他部分找到相同的名称,您的替换将被替换。虽然@saka1029 解决方案正确,但它使用的是 lambda,而我的实际项目使用的是不支持此语法的旧版本。
      • @Faisal 它正在替换任何由字符 a-z、A-Z 或 0-9 组合而成的字符串。你面临什么问题?是否所有值都没有附加_val?如果这是问题所在,如果您能告诉我如何命名任何值,我想我将能够提供帮助?
      • 感谢您的帮助... 以下是无法正常工作的案例,但我采用的方式略有不同。字符串 str = "{ \"otherValue\": \"AnyValue1\", \n" + "\"values\" : [\"AnyValue1\", \"TestValue\", \"Dummy\", \"SomeValue \“], \“核心价值\” }”;它也在发生变化:“otherValue”:“AnyValue1_val,虽然这不是“values”的一部分
      • @Faisal 我已经编辑了我的答案。它现在应该可以工作了。我确实根据您提供的输入对其进行了测试。 如果您遇到任何其他问题,请发表评论。我希望其他人回答您的问题。我发现我的答案很复杂。 我认为你的问题可能存在一个更简单的问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2019-03-29
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多