JAVA获取字符串内的括号对(支持多层级);获取括号对的内容;按指定规则返回括号对位置;
先看结果:处理字符串
"这个是一条测试用的字符串[ ( 5 ( 4( 3 [(1) (2)] ))(7))][(6)]"
结果
解决思路:参考正则表达式里面出入站部分
代码实现如下:
方法调用“:
String test = "这个是一条测试用的字符串[ ( 5( 4( 3 [(1) (2)] ))(7))][(6)]"; LinkedHashMap<Integer, Integer> linkedHashMap = getBracketPairs(test, '('); System.out.println(JSON.toJSONString(linkedHashMap));
//此处value+1可以 把)也打印出来 默认 substring 不包含右侧末尾位置
linkedHashMap.forEach((key, value) -> System.out.println(test.substring(key, value+1)));
/**
* <p> 获取对应的括号组位置 </p>
* 例如{37:39,26:28,43:45,30:32,21:35,18:36,15:40}
* @param string 字符串
* @param symbolLeft 左侧符号 内置三类 ( [ {
* @return {@link LinkedHashMap }<{@link Integer }, {@link Integer }>
* @author bokeyuan - jian nan chun
* @since 0.0.1 2023-07-03
*/
private static LinkedHashMap<Integer, Integer> getBracketPairs(String string, Character symbolLeft) { Map<Character, Character> characterHashMap = new HashMap<>(); characterHashMap.put('(', ')'); characterHashMap.put('[', ']'); characterHashMap.put('{', '}'); Character symbolRight = characterHashMap.get(symbolLeft); if (symbolRight == null || symbolRight.toString().length() < 1) { return new LinkedHashMap<>(); } char[] strArray = string.toCharArray(); //找到所有左右()的位置 ArrayList<Integer> right = new ArrayList<>(); ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < strArray.length; i++) { if (strArray[i] == symbolLeft) { list.add(i); } else if (strArray[i] == symbolRight) { right.add(i); list.add(i); } } LinkedList<Integer> linkedList = new LinkedList<>(); Map<Integer, Integer> integerMap = new HashMap<>(); for (int a : list) { boolean contains = right.stream().anyMatch(x -> x == a); if (!contains) { linkedList.add(a); } else { if (linkedList.size() > 0) { Integer leInt = linkedList.get(linkedList.size() - 1); integerMap.put(leInt, a); linkedList.removeLast(); } } } return integerMap.entrySet().stream() .sorted((o1, o2) -> { int c1 = o1.getValue() - o1.getKey(); int c2 = o2.getValue() - o2.getKey(); return Integer.compare(c1, c2); }) .collect(LinkedHashMap::new, (map, entry) -> { map.put(entry.getKey(), entry.getValue()); }, LinkedHashMap::putAll); }
由于目的是进行SQL脚本适配;当前排序只排序最小单元 可自定义按需配置 即 sorted 部分
白茶清欢无别事,我在等风也等你,苦酒折柳今相离,无风无月也无你。
标签:
工具类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理