如何用正则表达式提取方括号与圆括号内内容并生成列表/数组?
解决方案
当然有!要同时提取方括号和圆括号内的内容(包括嵌套的括号结构),你需要使用支持平衡组/递归匹配的正则表达式——普通正则没法处理像[1[35]]或(BULK(KIN[...](MARK)))这种嵌套括号的情况。
适配Java的正则表达式
针对你的需求,我们可以写一个能匹配嵌套方括号和圆括号的正则,并且直接捕获括号内的核心内容:
\\[(?<inner>(?:[^\\[\\]]|(?R))*)\\]|\\((?<inner>(?:[^()]|(?R))*)\\)
(?R):表示递归匹配整个正则表达式,专门用来处理嵌套的括号结构(?<inner>):命名捕获组,用来精准提取括号内的文本- 两部分用
|分隔,分别覆盖方括号和圆括号的匹配场景
完整代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ExtractBracketContent { public static void main(String[] args) { String example = "[21](BULK(KIN[1[35]](MARK)))"; // 匹配嵌套方括号/圆括号并捕获内部内容 String regex = "\\[(?<inner>(?:[^\\[\\]]|(?R))*)\\]|\\((?<inner>(?:[^()]|(?R))*)\\)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(example); // 遍历输出所有匹配到的括号内内容 while (matcher.find()) { String content = matcher.group("inner"); System.out.println(content); } } }
运行结果
执行这段代码后,你会得到所有括号内的内容(包括嵌套层级里的):
21 BULK(KIN[1[35]](MARK)) 1[35] 35 MARK
为什么你的原有正则失效?
你之前用的\\(([^)]+)\\)依赖[^)]+匹配字符,它会把第一个)作为终止符,遇到嵌套的)就会提前停止匹配。比如在你的示例里,它只能提取到BULK(KIN[1[35]](MARK,而不是完整的嵌套括号内容。递归正则(?R)则能正确识别括号的嵌套层级,匹配到最外层的闭合括号。
注意事项
- 这个正则需要Java 9及以上版本支持,因为Java 9才引入了递归正则的语法
(?R)。 - 如果要兼容Java 8及以下版本,可以考虑手动处理嵌套逻辑,或者使用第三方正则库辅助。
内容的提问来源于stack exchange,提问作者sammyukavi
相关产品推荐
相关产品推荐

