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

如何用Java匹配括号内内容?JDK17正则匹配问题求助

问题原因与解决办法

核心问题

你使用的Matcher.matches()方法要求整个输入字符串完全匹配正则表达式,而测试字符串"11(adfa-2342)df"包含括号外的多余内容,因此匹配失败。在线正则工具默认是查找字符串中存在的匹配子串,而非强制全串匹配,这就是本地代码和在线工具结果不一致的原因。

解决步骤

  1. 替换匹配方法:将matches()改为find(),该方法会查找字符串中是否存在符合正则的子串,而非要求全串匹配。
  2. 可选:提取括号内的纯文本:如果需要获取括号内的内容(不含括号本身),可以调整正则表达式,给目标内容添加捕获组。

修改后的测试代码

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,提问作者孔乙已

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:42:09