使用正则表达式替换重复模式追加
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\" ";
【问题讨论】:
答案取决于您存储信息的方式。正则表达式可以应用于strings
或texts
。 如果你有一个字符串或一些文本 = "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.Pattern
或 java.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 我已经编辑了我的答案。它现在应该可以工作了。我确实根据您提供的输入对其进行了测试。 如果您遇到任何其他问题,请发表评论。我希望其他人回答您的问题。我发现我的答案很复杂。 我认为你的问题可能存在一个更简单的问题。以上是关于使用正则表达式替换重复模式追加的主要内容,如果未能解决你的问题,请参考以下文章