• java使用正则提取数据


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

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

    1. [
    2. {
    3. "label": "西瓜",
    4. "value": 0
    5. },
    6. {
    7. "label": "苹果",
    8. "value": 1
    9. },
    10. {
    11. "label": "草莓",
    12. "value": 2
    13. },
    14. {
    15. "label": "柚子",
    16. "value": 3
    17. },
    18. {
    19. "label": "葡萄",
    20. "value": 4
    21. }
    22. ]

    正则表达式

    "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正则表达式提取结果

    1. import lombok.extern.slf4j.Slf4j;
    2. import org.junit.Test;
    3. import java.util.regex.Matcher;
    4. import java.util.regex.Pattern;
    5. @Slf4j
    6. public class RegularExpressionTest {
    7. /**
    8. * 提取label和value的值
    9. *

    10. * [
    11. * {
    12. * "label": "西瓜",
    13. * "value": 0
    14. * },
    15. * {
    16. * "label": "苹果",
    17. * "value": 1
    18. * },
    19. * {
    20. * "label": "草莓",
    21. * "value": 2
    22. * },
    23. * {
    24. * "label": "柚子",
    25. * "value": 3
    26. * },
    27. * {
    28. * "label": "葡萄",
    29. * "value": 4
    30. * }
    31. * ]
    32. *

    33. * 因为json字符串在不同的工具复制来复制去,出现不同的格式,例如空格和换行,这里列举在实际处理中遇到的2终变种格式
    34. *

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

    37. * [ { "label": "西瓜", "value": 0 }, { "label": "苹果", "value": 1 }, { "label": "草莓", "value": 2 }, { "label": "柚子", "value": 3 }, { "label": "葡萄", "value": 4 }]
    38. *
    39. * @param
    40. * @return void
    41. * @author fangyunhe
    42. * @time 2023/9/20 10:40
    43. **/
    44. @Test
    45. public void test() {
    46. String jsonStr = "[\n" +
    47. " {\n" +
    48. " \"label\": \"西瓜\",\n" +
    49. " \"value\": 0\n" +
    50. " },\n" +
    51. " {\n" +
    52. " \"label\": \"苹果\",\n" +
    53. " \"value\": 1\n" +
    54. " },\n" +
    55. " {\n" +
    56. " \"label\": \"草莓\",\n" +
    57. " \"value\": 2\n" +
    58. " },\n" +
    59. " {\n" +
    60. " \"label\": \"柚子\",\n" +
    61. " \"value\": 3\n" +
    62. " },\n" +
    63. " {\n" +
    64. " \"label\": \"葡萄\",\n" +
    65. " \"value\": 4\n" +
    66. " }\n" +
    67. "]";
    68. //String jsonStr = "[{\"label\":\"西瓜\",\"value\":0},{\"label\":\"苹果\",\"value\":1},{\"label\":\"草莓\",\"value\":2},{\"label\":\"柚子\",\"value\":3},{\"label\":\"葡萄\",\"value\":4}]";
    69. //String jsonStr = "[ { \"label\": \"西瓜\", \"value\": 0 }, { \"label\": \"苹果\", \"value\": 1 }, { \"label\": \"草莓\", \"value\": 2 }, { \"label\": \"柚子\", \"value\": 3 }, { \"label\": \"葡萄\", \"value\": 4 }]";
    70. String patternStr = "\"label\":\\s?\"(.{1,2})\",\\s*\"value\":\\s?(\\d{1,2})";
    71. Pattern pattern = Pattern.compile(patternStr);
    72. Matcher matcher = pattern.matcher(jsonStr);
    73. while (matcher.find()) {
    74. log.info(matcher.group(1) + ":" + matcher.group(2));
    75. }
    76. }
    77. }

    执行结果

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

  • 相关阅读:
    基于SSM实现微博系统
    使用VM Ware创建虚拟机
    代码随想录训练营day58
    keil stm32f407工程环境搭建
    java中jvm使用jststak定位线程cpu占用内存高的线程
    (面试经典刷题)挑战一周刷完150道-Python版本-第3天(40个题)-I(前10个题)
    python【模块】xml.etree.ElementTree 解析 xml
    java-net-php-python-jsp大学生兼职平台计算机毕业设计程序
    Java岗史上最全八股文面试真题汇总,堪称2022年面试天花板
    pthread_create函数的应用
  • 原文地址:https://blog.csdn.net/ffyyhh995511/article/details/133160896