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

Java如何验证含多括号的正则表达式并提取字符串组件?

Java正则验证与内容提取实现

需求明确

需要验证输入字符串是否符合标识符(值对),标识符(值对)...的格式,其中:

  • 标识符:由字母、数字组成的字符串
  • 值对:数字或带引号的日期时间 : 数字或带引号的日期时间,数字支持整数和小数,日期时间用双引号包裹

编写正则表达式

先拆分各部分的子正则:

  • 数字匹配:\\d+(\\.\\d+)?(匹配整数如123或小数如135.666)
  • 带引号的日期时间匹配:"[^"]+"(匹配双引号包裹的任意非引号内容,比如例子中的"2015-06-07T09:01:05")
  • 单个元素模式:([a-zA-Z0-9]+)\\((((\\d+(\\.\\d+)?)|"[^"]+"):((\\d+(\\.\\d+)?)|"[^"]+"))\\)
  • 完整匹配正则:^([a-zA-Z0-9]+)\\((((\\d+(\\.\\d+)?)|"[^"]+"):((\\d+(\\.\\d+)?)|"[^"]+"))\\)(,[a-zA-Z0-9]+\\((((\\d+(\\.\\d+)?)|"[^"]+"):((\\d+(\\.\\d+)?)|"[^"]+"))\\))*$

Java代码实现

以下代码完成格式验证和内容提取:

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

public class RegexDemo {
    public static void main(String[] args) {
        String input = "abc(123:456),def(135.666:3434.777),ghi(\"2015-06-07T09:01:05\":\"2015-07-08\")";
        
        // 定义完整正则,使用非捕获组优化分组结构
        String regex = "^([a-zA-Z0-9]+)\\((((?:\\d+(?:\\.\\d+)?)|\"[^\"]+\"):((?:\\d+(?:\\.\\d+)?)|\"[^\"]+\"))\\)(?:,([a-zA-Z0-9]+)\\((((?:\\d+(?:\\.\\d+)?)|\"[^\"]+\"):((?:\\d+(?:\\.\\d+)?)|\"[^\"]+\"))\\))*$";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        // 验证整个字符串是否匹配
        if (matcher.matches()) {
            System.out.println("输入格式符合要求");
            
            // 提取第一个元素的标识符和值对
            String firstId = matcher.group(1);
            String firstPair = matcher.group(2);
            System.out.println("第一个元素:");
            System.out.println("标识符:" + firstId);
            System.out.println("值对:" + firstPair);
            
            // 提取后续所有元素
            String elementRegex = "([a-zA-Z0-9]+)\\((((?:\\d+(?:\\.\\d+)?)|\"[^\"]+\"):((?:\\d+(?:\\.\\d+)?)|\"[^\"]+\"))\\)";
            Pattern elementPattern = Pattern.compile(elementRegex);
            Matcher elementMatcher = elementPattern.matcher(input);
            
            System.out.println("\n所有元素:");
            while (elementMatcher.find()) {
                String id = elementMatcher.group(1);
                String pair = elementMatcher.group(2);
                System.out.printf("标识符:%s,值对:%s%n", id, pair);
            }
        } else {
            System.out.println("输入格式不符合要求");
        }
    }
}

代码说明

  1. 格式验证:通过matcher.matches()判断整个字符串是否完全匹配正则规则
  2. 内容提取:
    • 若只需提取首元素,可直接使用matches()后的分组结果
    • 若要遍历所有元素,使用匹配单个元素的正则,通过find()循环提取每个元素的标识符和值对
  3. 非捕获组:使用(?:...)定义非捕获组,避免不必要的分组索引混乱,优化正则结构

内容的提问来源于stack exchange,提问作者Bằng Rikimaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:25:29