如何在Java中使用正则表达式提取括号间的子字符串?
嘿,这个需求我之前做项目的时候刚好碰到过,用Java正则提取括号里的内容其实挺灵活的,得根据你的具体场景来选写法,我给你一步步拆解:
提取单个括号对中的内容
就像你举的例子abc(de)gh,要精准拿到de,核心思路是用正则捕获组锁定括号里的内容。对应的正则表达式是\\((.*?)\\),这里的细节得注意:
\\(和\\):因为括号在正则里是用来定义捕获组的特殊字符,所以必须用反斜杠转义才能匹配实际的括号(.*?):这是一个非贪婪的捕获组,.*?会匹配任意字符,直到遇到第一个右括号就停止,刚好能拿到括号里的内容
直接上可运行的Java代码:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class BracketExtractor { public static void main(String[] args) { String input = "abc(de)gh"; // 编译正则表达式 Pattern pattern = Pattern.compile("\\((.*?)\\)"); Matcher matcher = pattern.matcher(input); // 找到匹配项后,取第一个捕获组的内容 if (matcher.find()) { String extracted = matcher.group(1); System.out.println(extracted); // 输出: de } } }
处理多个括号对的场景
如果你的字符串里有多个括号,比如abc(de)fg(hi)jk,要把所有括号里的内容都提取出来,只需要循环调用matcher.find()就行:
import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.ArrayList; import java.util.List; public class MultiBracketExtractor { public static void main(String[] args) { String input = "abc(de)fg(hi)jk"; Pattern pattern = Pattern.compile("\\((.*?)\\)"); Matcher matcher = pattern.matcher(input); List<String> results = new ArrayList<>(); // 循环查找所有匹配项 while (matcher.find()) { results.add(matcher.group(1)); } System.out.println(results); // 输出: [de, hi] } }
特殊情况:嵌套括号
如果遇到嵌套括号的场景,比如abc(de(fg)hi)jk,上面的非贪婪正则就会失效(会只拿到de(fg),因为正则本身不支持递归匹配嵌套结构。这种情况更稳妥的做法是用手动解析(比如借助栈):
public class NestedBracketExtractor { public static String extractNestedContent(String input) { int startIndex = input.indexOf('('); if (startIndex == -1) { return ""; // 没有括号直接返回空 } int bracketCount = 1; int endIndex = startIndex + 1; // 遍历字符串,统计括号数量,找到匹配的右括号 while (endIndex < input.length() && bracketCount > 0) { char currentChar = input.charAt(endIndex); if (currentChar == '(') { bracketCount++; } else if (currentChar == ')') { bracketCount--; } endIndex++; } // 截取括号之间的内容 return input.substring(startIndex + 1, endIndex - 1); } public static void main(String[] args) { String input = "abc(de(fg)hi)jk"; System.out.println(extractNestedContent(input)); // 输出: de(fg)hi } }
内容的提问来源于stack exchange,提问作者Tirth Trivedi
相关产品推荐
相关产品推荐

