求助:如何在Java中使用正则表达式提取指定格式的子串
Java正则提取子串解决方案
嘿,我来帮你搞定这个Java正则提取子串的需求!针对你给出的两种输入格式,我们可以用两种简洁的方式实现目标效果。
需求回顾
输入有两种形式:
- 05-05-2018 - Ab12aB 0-1 Bq12B (Acb123)
- 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
相关产品推荐
相关产品推荐

