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("输入格式不符合要求"); } } }
代码说明
- 格式验证:通过
matcher.matches()判断整个字符串是否完全匹配正则规则 - 内容提取:
- 若只需提取首元素,可直接使用
matches()后的分组结果 - 若要遍历所有元素,使用匹配单个元素的正则,通过
find()循环提取每个元素的标识符和值对
- 若只需提取首元素,可直接使用
- 非捕获组:使用
(?:...)定义非捕获组,避免不必要的分组索引混乱,优化正则结构
内容的提问来源于stack exchange,提问作者Bằng Rikimaru
相关产品推荐
相关产品推荐

