如何用Java正则表达式匹配初始值与多组键值对?
解决Java正则提取初始值与键值对的问题
正则表达式设计
针对你的文本结构,可分两步处理,也可用复合正则一次性捕获:
- 提取头部(HEADER):匹配第一个
{之前的所有内容,正则为:^([^{]+) - 提取键值对:匹配
{数字}格式的键,以及后续直到下一个{或文本结尾的内容,正则为:{(\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
相关产品推荐
相关产品推荐

