使用正则表达式替换重复模式追加

Posted

技术标签:

【中文标题】使用正则表达式替换重复模式追加【英文标题】: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\" "; 届时我将研究解决方案。 【参考方案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 我已经编辑了我的答案。它现在应该可以工作了。我确实根据您提供的输入对其进行了测试。 如果您遇到任何其他问题,请发表评论。我希望其他人回答您的问题。我发现我的答案很复杂。 我认为你的问题可能存在一个更简单的问题

以上是关于使用正则表达式替换重复模式追加的主要内容,如果未能解决你的问题,请参考以下文章

Python - 正则表达式不替换目录字符串[重复]

正则表达式说明

Shell编程之正则表达式(sed)

MySQL之正则表达式(REGEXP)

我不能使用正则表达式替换包含“\”字符的文本[重复]

正则表达式替换重复捕获