java正则表达式替换小记(用到了分组捕获和非贪婪匹配)

博客围绕同事提出的Java正则匹配替换字符串问题展开。该JSON字符串存在格式问题,需将studens后的JSON数组用[]括起来。作者采用分组捕获思路解决,给出两种正则表达式写法,并使用Java进行验证,还提供了相关参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题说明

这个是同事问的一个使用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);
    }
}

四、参考链接

解惑正则表达式中的捕获

正则表达式高级用法(分组与捕获)

正则表达式的向前、向后匹配

正则表达式贪婪与非贪婪模式

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值