Java字符串拆分问题:如何提取嵌套括号内的目标子串?
解决Java字符串提取(B⋈C)和(E⋈F)的问题
嘿,我明白你现在的需求——从[A⋈ (B⋈C)]⋈[D⋈ (E⋈F)]这个字符串里提取出(B⋈C)和(E⋈F)这两个子串。你之前用String.split()的思路走不通,主要是因为split的定位是分割字符串,而你要的是提取符合特定模式的子串,而且你原来的正则写法也有问题,咱们一步步来修正:
为什么你的原有代码没效果?
你写的Pattern.quote("(?=-)")会把整个(?=-)转义成普通字符串,相当于告诉split“按字面的(?=-)这个字符串来分割”,但你的原字符串里根本没有这个内容,所以split之后还是原字符串,自然得不到想要的结果。
正确的解决方案:用正则匹配提取子串
咱们换个思路,用Pattern和Matcher来查找符合(xxx)格式的子串,这才是提取目标内容的正确姿势:
import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ExtractSubstrings { public static void main(String[] args) { String str = "[A⋈ (B⋈C)]⋈[D⋈ (E⋈F)]"; // 正则解释: // \\( 匹配左括号(转义是因为括号在正则里是特殊字符) // [^)]+ 匹配任意非右括号的字符,至少一个(确保匹配到括号内的所有内容) // \\) 匹配右括号 Pattern pattern = Pattern.compile("\\([^)]+\\)"); Matcher matcher = pattern.matcher(str); ArrayList<String> itemList = new ArrayList<>(); // 循环查找所有符合模式的子串 while (matcher.find()) { itemList.add(matcher.group()); } System.out.println(itemList); // 输出结果:[(B⋈C), (E⋈F)] } }
额外说明
如果你的字符串里可能出现嵌套括号(比如(A⋈(B⋈C))),那上面的简单正则就不够用了,因为正则本身对嵌套结构的支持有限,这时候可能需要手动遍历字符串来处理括号的层级,但从你给出的例子来看,单层括号的场景用上面的代码完全足够。
内容的提问来源于stack exchange,提问作者nadra
相关产品推荐
相关产品推荐

