如何用Java匹配括号内内容?JDK17正则匹配问题求助
问题原因与解决办法
核心问题
你使用的Matcher.matches()方法要求整个输入字符串完全匹配正则表达式,而测试字符串"11(adfa-2342)df"包含括号外的多余内容,因此匹配失败。在线正则工具默认是查找字符串中存在的匹配子串,而非强制全串匹配,这就是本地代码和在线工具结果不一致的原因。
解决步骤
- 替换匹配方法:将
matches()改为find(),该方法会查找字符串中是否存在符合正则的子串,而非要求全串匹配。 - 可选:提取括号内的纯文本:如果需要获取括号内的内容(不含括号本身),可以调整正则表达式,给目标内容添加捕获组。
修改后的测试代码
package com.example.ticket_query; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.regex.Matcher; import java.util.regex.Pattern; class TicketQueryApplicationTest { Pattern pattern = Pattern.compile(".*station_train_code.*"); // 调整正则,添加捕获组以提取括号内的内容(可选) Pattern stationNamePattern = Pattern.compile("\\((.*-.*)\\)"); @DisplayName(value = "获取所有的车站名称") @Test void getStationName() { String s = "11(adfa-2342)df"; Matcher stationNames = stationNamePattern.matcher(s); // 使用find()查找匹配的子串 if (stationNames.find()) { // 输出包含括号的匹配内容 System.out.println("完整匹配内容:" + stationNames.group()); // 输出括号内的纯文本(需要正则添加捕获组) System.out.println("括号内的内容:" + stationNames.group(1)); } } }
补充说明
- 如果只需要判断括号内容是否存在,不需要提取的话,正则保持
"\\(.*-.*\\)"即可,用find()方法就能得到正确结果。 - 若你的实际场景是从类似
"station_train_code": "D29(天津西-齐齐哈尔南)"的字符串中提取车站名,同样可以用上述逻辑,先匹配到包含目标的行,再用find()提取括号内容。
内容的提问来源于stack exchange,提问作者孔乙已
相关产品推荐
相关产品推荐

