先看结果:处理字符串

"这个是一条测试用的字符串[  ( 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 xhūnchéng Xú
* @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  部分

参考文章思路:正则表达式匹配对称小括号 - 曹万军 - 博客园 (cnblogs.com)

JAVA获取字符串内的括号对;获取括号对的内容;按指定规则返回括号对位置;的更多相关文章

  1. 递归获取字符串内的所有图片src地址

    // 递归调用获取字符串内所有的src地址 -(NSMutableArray *)getImageSrcUrlWithString:(NSString *)str withArray:(NSMutab ...

  2. 正则表达式 获取字符串内提取图片URL字符串

    #region 获取字符串内提取图片URL字符串 /// <summary> /// 获取字符串内提取图片URL字符串 /// </summary> /// <param ...

  3. 常见的VC获取字符串长度的方法

    字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目.常见的获取字符串长度的方法包括如下几种.后面有源码和最终效果图 1.使用sizeof获取字符串长度 sizeof ...

  4. 7.python字符串-内置方法分析

    上篇对python中的字符串内置方法进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法按照其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -& ...

  5. python字符串-内置方法用法分析

    1.字母大小写相关(中文无效) 1.1 S.upper() -> string 返回一个字母全部大写的副本

  6. java:javaScript(定义方式,循环语句,函数与参数,事件机制,控制台记录,event事件获取键盘ascii,confirm和prompt,事件和内置对象,获取input,点击更换背景色)

    1. 定义JS的两种方式: <!DOCTYPE> <html> <head> <meta charset="UTF-8"></ ...

  7. java通过StringToKenizer获取字符串中的单词根据空格分离-简写版

    public class StringToKenizer { public static void main(String[] args) { String strin = "Hello J ...

  8. java通过StringToKenizer获取字符串中的单词根据空格分离-详情版

    public class DaXie { public static void main(String[] args) { String strin = "Hello Java World! ...

  9. .NET 获取类内成员的名称,以字符串形式显示

    需要做一个功能,显示类内的属性名和对应的值.比如有类 Public Class SupervisedParams     Public TestMode As string     Public Ti ...

  10. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

随机推荐

  1. IIC总线协议—读写EEPROM

    IIC总线协议-读写EEPROM 1.I2C简介 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USA ...

  2. mysql 命令批量修改一个字段/帝国cms sql命令修改一个字段

    UPDATE phome_enewstagsdata SET classid=5 where classid=1 UPDATE phome_ecms_news SET classid=8 where ...

  3. Nacos注册中心

    介绍 Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册.服务发现规范.因此使用Nacos和使用Eureka对于 ...

  4. ASTAR机台(win7 p'rofessional)使用python tool中文显示异常问题解决

    1.双击"computer"打开界面如下,再单击"open control panel"打开控制面板. 2.在控制面板中点击"Clock,Langua ...

  5. CS144 计算机网络 Lab2:TCP Receiver

    前言 Lab1 中我们使用双端队列实现了字节流重组器,可以将无序到达的数据重组为有序的字节流.Lab2 将在此基础上实现 TCP Receiver,在收到报文段之后将数据写入重组器中,并回复发送方. ...

  6. SSM之简单的CRUD

    文章目录 前言 项目介绍 项目代码介绍 数据库文件 源码介绍 代码展示 配置文件 业务逻辑代码 总结 前言 大家好呀,前面不是说最近在学习SSM么,可能学的不是那么深,不过刚刚开始,学完肯定需要先动手 ...

  7. 关于PM系统以及OA系统的工作基本心态

    这个系统的目的是什么? 这个系统的初衷是好的,是一个信息化管理的数据科学系统,目的是更好的累计公司的业务数据. 但实际操作过程中,包括推广过程中,你能看到上层人员对于这个系统的态度,更像是一个个人企业 ...

  8. selenium配置远程测试环境

    开头 因为测试的时候需要不断打开浏览器,这样效率感觉不高,于是想着能不能开启一个浏览器,然后通过代码直接链接来调试就好了. 前提 要先安装好selenium 和 会查看配置自己的google版本和路径 ...

  9. 音视频八股文(12)-- ffmpeg 音频重采样

    1重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率.sample format.声道数等参数,使之按照我们期望的参数输出. 1.2 为什么要重采样 为什么要重采样?当然是原有的⾳频参数 ...

  10. 音视频八股文(8)-- h264 AnnexB三层结构

    NALU(Network Abstract Layer Unit) ⾳视频编码在流媒体和⽹络领域占有重要地位:流媒体编解码流程⼤致如下图所示: H264简介 H.264从1999年开始,到2003年形 ...