一、问题说明
这个是同事问的一个使用java正则匹配替换字符串的问题,花了点时间解决。或许会有更好的解决办法,我这里还是采用正则来解决,顺便复习下很久没用过的正则表达式。
有一个json字符串如下:
{"code":0,"students":{"s001":{"sname":"张三","sage":"10"},"s002":{"sname":"李四","sage":"20"},"s003":{"sname":"王五","sage":"30"}}}
细心的人肯定会注意到,上面这个json是有问题的,就是studens后接的json数组不是用{}括起来,而应该使用[],如下所示:
{"code":0,"students":["s001":{"sname":"张三","sage":"10"},"s002":{"sname":"李四","sage":"20"},"s003":{"sname":"王五","sage":"30"}]}
现在的问题是:
二、解决过程
思路:
直接匹配替换的话,我还没想到该怎么做。我首先想到的是分组捕获,如下图所示:
现在问题的关键是,编写一个正则表达式能够把原本的字符串s拆分成上图所示的3组
我想了两种写法:
写法1:
稍微有点麻烦
写法2:
这个简单点
三、验证
我用的是java,不同语言可能写法上有些差异,但原理是相通的
测试代码:
package com.kittycoder;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by shucheng on 2020/11/18 11:22
*/
public class ReadTextTest {
private String str;
// 读取字符串
@Before
public void setUp() throws IOException {
ClassPathResource resource = new ClassPathResource("1.txt");
File file = resource.getFile();
BufferedReader reader = new BufferedReader(new FileReader(file));
str = reader.readLine();
reader.close();
}
// 写法1
@Test
public void test() {
// 正则匹配
// (?<=(\{"code":0,"students":))\{(.*\})(?=\}(\}))
Pattern p = Pattern.compile("(?<=(\\{\"code\":0,\"students\":))\\{(.*\\})(?=\\}(\\}))");
Matcher matcher = p.matcher(str);
// 替换成新字符串
String newStr = null;
if (matcher.find()) {
newStr = matcher.group(1) + "[" + matcher.group(2) + "]" + matcher.group(3);
}
System.out.println(newStr);
}
// 写法2
@Test
public void test2() {
// 正则匹配
// (\{.*?)\{(.*\})\}(\})
Pattern p = Pattern.compile("(\\{.*?)\\{(.*\\})\\}(\\})");
Matcher matcher = p.matcher(str);
// 替换成新字符串
String newStr = null;
if (matcher.find()) {
newStr = matcher.group(1) + "[" + matcher.group(2) + "]" + matcher.group(3);
}
System.out.println(newStr);
}
}
四、参考链接
解惑正则表达式中的捕获