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

求助:如何在Java中使用正则表达式提取指定格式的子串

Java正则提取子串解决方案

嘿,我来帮你搞定这个Java正则提取子串的需求!针对你给出的两种输入格式,我们可以用两种简洁的方式实现目标效果。

需求回顾

输入有两种形式:

  1. 05-05-2018 - Ab12aB 0-1 Bq12B (Acb123)
  2. 05-05-2018 - Ab12aB 0-1 Bq12B

期望输出:

含括号的输入 → 05-05-2018 Ab12aB 0-1 Bq12B Acb123
不含括号的输入 → 05-05-2018 Ab12aB 0-1 Bq12B


方法一:正则替换(简洁高效)

这种方法直接通过替换不需要的符号来得到结果,代码量少,适合结构固定的场景:

public class StringExtractor {
    public static void main(String[] args) {
        String input1 = "05-05-2018 - Ab12aB 0-1 Bq12B (Acb123)";
        String input2 = "05-05-2018 - Ab12aB 0-1 Bq12B";
        
        System.out.println(extractContent(input1));
        System.out.println(extractContent(input2));
    }
    
    private static String extractContent(String input) {
        // 1. 把"-"前后的空格和"-"一起替换成单个空格
        String processed = input.replaceAll("\\s*-\\s*", " ");
        // 2. 把括号及括号里的内容替换成括号内的文本
        processed = processed.replaceAll("\\((\\w+)\\)", "$1");
        // 3. 去除多余的连续空格(避免可能的格式问题)
        return processed.trim().replaceAll("\\s+", " ");
    }
}

代码解释

  • \\s*-\\s*:匹配-前后任意数量的空格,替换成单个空格,把日期 - 内容变成日期 内容
  • \\((\\w+)\\):匹配括号包裹的内容,用$1引用括号内捕获的文本,直接去掉括号
  • trim()和replaceAll("\\s+", " "):确保结果没有首尾空格,且中间只有单个空格分隔

方法二:捕获组提取(灵活可控)

如果你需要单独处理每个提取出的部分(比如对日期做格式转换),用捕获组的方式会更灵活:

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

public class RegexGroupExtractor {
    public static void main(String[] args) {
        String input1 = "05-05-2018 - Ab12aB 0-1 Bq12B (Acb123)";
        String input2 = "05-05-2018 - Ab12aB 0-1 Bq12B";
        
        String regex = "(\\d{2}-\\d{2}-\\d{4})\\s*-\\s*([\\w\\s-]+?)(?:\\s*\\((\\w+)\\))?";
        Pattern pattern = Pattern.compile(regex);
        
        extractWithGroups(pattern, input1);
        extractWithGroups(pattern, input2);
    }
    
    private static void extractWithGroups(Pattern pattern, String input) {
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            StringBuilder result = new StringBuilder();
            // 添加日期部分
            result.append(matcher.group(1)).append(" ");
            // 添加中间内容,先去除首尾空格
            result.append(matcher.group(2).trim()).append(" ");
            // 如果存在括号内容,添加进去;否则去掉最后多余的空格
            if (matcher.group(3) != null) {
                result.append(matcher.group(3));
            } else {
                result.setLength(result.length() - 1);
            }
            System.out.println(result.toString());
        } else {
            System.out.println("输入格式不匹配,请检查输入内容");
        }
    }
}

正则表达式解释

  • (\\d{2}-\\d{2}-\\d{4}):捕获日期部分(DD-MM-YYYY格式)
  • \\s*-\\s*:匹配-前后的空格,分隔日期和后续内容
  • ([\\w\\s-]+?):非贪婪捕获中间的内容(包含字母、数字、空格和连字符)
  • (?:\\s*\\((\\w+)\\))?:可选的括号部分,?:表示非捕获组,内部的(\\w+)捕获括号里的内容,?表示这部分可以不存在

两种方法都能完美实现你的需求,你可以根据实际场景选择:如果只是简单的格式转换,用方法一更省心;如果需要对各部分做额外处理,方法二更合适。

内容的提问来源于stack exchange,提问作者Nguyen Duc Quy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:42:04