java使用正则提取数据

一、正则提取文本指定数据

需要对一个json结构做数据的提取,提取label和value的值,组成新的结构,西瓜:0、苹果:1、草莓:2
原始json字符串如下格式

[
  {
    "label": "西瓜",
    "value": 0
  },
  {
    "label": "苹果",
    "value": 1
  },
  {
    "label": "草莓",
    "value": 2
  },
  {
    "label": "柚子",
    "value": 3
  },
  {
    "label": "葡萄",
    "value": 4
  }
]

正则表达式

"label":\s"(.*)",\s+"value":\s(\d+)

结合正则的分组模式$1、$2可以提取,但是在实际java开发中,字符串格式发生了变化,字符串多了空格和换行等,因此需要再完善正则表达式。

该json字符串出现的变种如下:

变种1

[{"label":"西瓜","value":0},{"label":"苹果","value":1},{"label":"草莓","value":2},{"label":"柚子","value":3},{"label":"葡萄","value":4}]

变种2

[  {    "label": "西瓜",    "value": 0  },  {    "label": "苹果",    "value": 1  },  {    "label": "草莓",    "value": 2  },  {    "label": "柚子",    "value": 3  },  {    "label": "葡萄",    "value": 4  }]

新的正则写法

"label":"(.{1,2})","value":(\d{1,2})

只能匹配变种1,原始json字符串和变种2不适应,
最终调试改为如下正则写法,三种情况的json字符串都可以匹配。

"label":\s?"(.{1,2})",\s*"value":\s?(\d{1,2})

二、正则表达式详解

三、java正则表达式提取结果

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


@Slf4j
public class RegularExpressionTest {

    /**
     * 提取label和value的值
     * <p>
     * [
     * {
     * "label": "西瓜",
     * "value": 0
     * },
     * {
     * "label": "苹果",
     * "value": 1
     * },
     * {
     * "label": "草莓",
     * "value": 2
     * },
     * {
     * "label": "柚子",
     * "value": 3
     * },
     * {
     * "label": "葡萄",
     * "value": 4
     * }
     * ]
     * <p>
     * 因为json字符串在不同的工具复制来复制去,出现不同的格式,例如空格和换行,这里列举在实际处理中遇到的2终变种格式
     * <p>
     * [{"label":"西瓜","value":0},{"label":"苹果","value":1},{"label":"草莓","value":2},{"label":"柚子","value":3},{"label":"葡萄","value":4}]
     * <p>
     * [  {    "label": "西瓜",    "value": 0  },  {    "label": "苹果",    "value": 1  },  {    "label": "草莓",    "value": 2  },  {    "label": "柚子",    "value": 3  },  {    "label": "葡萄",    "value": 4  }]
     *
     * @param
     * @return void
     * @author fangyunhe
     * @time 2023/9/20 10:40
     **/
    @Test
    public void test() {
        String jsonStr = "[\n" +
                "  {\n" +
                "    \"label\": \"西瓜\",\n" +
                "    \"value\": 0\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"苹果\",\n" +
                "    \"value\": 1\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"草莓\",\n" +
                "    \"value\": 2\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"柚子\",\n" +
                "    \"value\": 3\n" +
                "  },\n" +
                "  {\n" +
                "    \"label\": \"葡萄\",\n" +
                "    \"value\": 4\n" +
                "  }\n" +
                "]";
        //String jsonStr = "[{\"label\":\"西瓜\",\"value\":0},{\"label\":\"苹果\",\"value\":1},{\"label\":\"草莓\",\"value\":2},{\"label\":\"柚子\",\"value\":3},{\"label\":\"葡萄\",\"value\":4}]";
        //String jsonStr = "[  {    \"label\": \"西瓜\",    \"value\": 0  },  {    \"label\": \"苹果\",    \"value\": 1  },  {    \"label\": \"草莓\",    \"value\": 2  },  {    \"label\": \"柚子\",    \"value\": 3  },  {    \"label\": \"葡萄\",    \"value\": 4  }]";
        String patternStr = "\"label\":\\s?\"(.{1,2})\",\\s*\"value\":\\s?(\\d{1,2})";
        Pattern pattern = Pattern.compile(patternStr);
        Matcher matcher = pattern.matcher(jsonStr);
        while (matcher.find()) {
            log.info(matcher.group(1) + ":" + matcher.group(2));
        }      
    }
}

执行结果

17:08:50.684 [main] INFO  demo.test.RegularExpressionTest - 西瓜:0
17:08:50.890 [main] INFO  demo.test.RegularExpressionTest - 苹果:1
17:08:51.453 [main] INFO  demo.test.RegularExpressionTest - 草莓:2
17:08:51.838 [main] INFO  demo.test.RegularExpressionTest - 柚子:3
17:08:52.406 [main] INFO  demo.test.RegularExpressionTest - 葡萄:4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用则表达式来提取数据。具体的步骤如下: 1. 创建一个 Pattern 对象,该对象表示需要匹配的则表达式。 2. 使用 Pattern 对象的 matcher 方法,创建一个 Matcher 对象,该对象表示需要匹配的字符串。 3. 使用 Matcher 对象的 find 方法,查找匹配的字符串。 4. 使用 Matcher 对象的 group 方法,获取匹配到的字符串。 下面是一个简单的示例代码,演示了如何使用则表达式提取一个字符串中的数字: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo { public static void main(String[] args) { String input = "Hello 123 World"; Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(input); if (matcher.find()) { String match = matcher.group(); System.out.println("Matched: " + match); } else { System.out.println("No match found."); } } } ``` 在上面的代码中,我们使用了 `\d+` 这个则表达式来匹配字符串中的数字。其中,`\d` 表示匹配数字,`+` 表示匹配一个或多个数字。我们使用了 Pattern.compile 方法来创建一个 Pattern 对象,然后使用该对象的 matcher 方法来创建一个 Matcher 对象。接着,我们使用 Matcher 对象的 find 方法来查找匹配的字符串,如果找到了就使用 group 方法获取匹配到的字符串。最后,我们输出了匹配到的字符串。 执行上面的代码,输出结果如下: ``` Matched: 123 ``` 可以看到,我们成功地使用则表达式提取了字符串中的数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值