You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java正则表达式匹配初始值与多组键值对?

解决Java正则提取初始值与键值对的问题

正则表达式设计

针对你的文本结构,可分两步处理,也可用复合正则一次性捕获:

  1. 提取头部(HEADER):匹配第一个{之前的所有内容,正则为:^([^{]+)
  2. 提取键值对:匹配{数字}格式的键,以及后续直到下一个{或文本结尾的内容,正则为:{(\d+)}(.*?)(?={|$)

若要一次性捕获所有内容,可使用复合正则:^([^{]+)(?:{(\d+)}(.*?)(?={|$))+

正则各部分说明

  • ^([^{]+):匹配文本开头到第一个{的所有字符,捕获为HEADER
  • {(\d+)}:匹配{数字}格式的键,捕获数字部分作为键值对的键
  • (.*?):非贪婪匹配后续所有字符,避免过度匹配跨键值对的内容
  • (?={|$):正向预查,确保匹配到下一个{或者文本结尾就停止

Java代码实现示例

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

public class RegexExtractor {
    public static void main(String[] args) {
        String input = "abcd{123}hello world{456}asd * ~ . , 1243214 aadasd{678}asd aaasddd";
        
        // 提取HEADER
        Pattern headerPattern = Pattern.compile("^([^{]+)");
        Matcher headerMatcher = headerPattern.matcher(input);
        if (headerMatcher.find()) {
            System.out.println("    HEADER -> " + headerMatcher.group(1).trim());
        }
        
        // 提取所有键值对
        Pattern kvPattern = Pattern.compile("\\{(\\d+)\\}(.*?)(?=\\{|$)");
        Matcher kvMatcher = kvPattern.matcher(input);
        while (kvMatcher.find()) {
            String key = kvMatcher.group(1);
            String value = kvMatcher.group(2).trim();
            System.out.println("    " + key + " -> " + value);
        }
    }
}

运行输出

执行上述代码后,将得到你期望的结果:

HEADER -> abcd
    123 -> hello world
    456 -> asd * ~ . , 1243214 aadasd
    678 -> asd aaasddd

你之前正则的问题

你使用的(?:{\d{4}})([\w]+[\S]*[.,]*[\s]+)存在以下问题:

  • \d{4}要求匹配4位数字,但你的键是3位(123、456等),无法匹配目标内容
  • 分组内的规则限制过死,无法匹配包含空格和多种特殊字符的完整值,且贪婪匹配逻辑会导致跨键值对的错误匹配
  • 未处理开头的HEADER部分

内容的提问来源于stack exchange,提问作者wasanka wickramasinghe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:15