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 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获取字符串内的括号对;获取括号对的内容;按指定规则返回括号对位置;的更多相关文章
- 递归获取字符串内的所有图片src地址
// 递归调用获取字符串内所有的src地址 -(NSMutableArray *)getImageSrcUrlWithString:(NSString *)str withArray:(NSMutab ...
- 正则表达式 获取字符串内提取图片URL字符串
#region 获取字符串内提取图片URL字符串 /// <summary> /// 获取字符串内提取图片URL字符串 /// </summary> /// <param ...
- 常见的VC获取字符串长度的方法
字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目.常见的获取字符串长度的方法包括如下几种.后面有源码和最终效果图 1.使用sizeof获取字符串长度 sizeof ...
- 7.python字符串-内置方法分析
上篇对python中的字符串内置方法进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法按照其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -& ...
- python字符串-内置方法用法分析
1.字母大小写相关(中文无效) 1.1 S.upper() -> string 返回一个字母全部大写的副本
- java:javaScript(定义方式,循环语句,函数与参数,事件机制,控制台记录,event事件获取键盘ascii,confirm和prompt,事件和内置对象,获取input,点击更换背景色)
1. 定义JS的两种方式: <!DOCTYPE> <html> <head> <meta charset="UTF-8"></ ...
- java通过StringToKenizer获取字符串中的单词根据空格分离-简写版
public class StringToKenizer { public static void main(String[] args) { String strin = "Hello J ...
- java通过StringToKenizer获取字符串中的单词根据空格分离-详情版
public class DaXie { public static void main(String[] args) { String strin = "Hello Java World! ...
- .NET 获取类内成员的名称,以字符串形式显示
需要做一个功能,显示类内的属性名和对应的值.比如有类 Public Class SupervisedParams Public TestMode As string Public Ti ...
- 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值
ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...
随机推荐
- Springboot整合Jwt实现用户认证
前言 相信大家在进行用户认证中或多或少都要对用户进行认证,当前进行认证的方式有基于session.token等主流方式,但是目前使用最广泛的还是基于JWT的用户认证,特别适用于前后端分离的项目. 本篇 ...
- 创建SpringBoot项目,在yml中配置数据库, driver-class-name: com.mysql.cj.jdbc.Driver标红报错解决方式
一.报错原因 com.mysql.cj.jdbc.Driver一直标红报错,原因在于pom.xml中mysql包没有下载下来,或者在创建项目的时候有问题 二.解决方案 在pom.xml添加 <d ...
- Kurator v0.3.0版本发布
摘要:2023年4月8日,Kurator正式发布v0.3.0版本. 本文分享自华为云社区<华为云 Kurator v0.3.0 版本发布!集群舰队助力分布式云统一管理>,作者:云容器大未来 ...
- js-函数记忆
函数记忆: 指将上次的(计算结果)缓存起来,当下次调用时,如果遇到相同的(参数),就直接返回(缓存中的数据). 实现原理:将参数和对应的结果保存在对象中,再次调用时,判断对象 key 是否存在,存在返 ...
- Object-Advanced笔记
JavaScript对象进阶 数据劫持 1. 概念 一旦访问或者修改对象的属性时 拦截这个行为(访问/修改) 并对其添加除这个行为外的操作 最后返回结果 2. 实现 2.1 getter和setter ...
- StringBuilder类用法解析
一.StringBuilder说明 StringBuilder是一个可变的字符序列.这个类提供了一个与StringBuffer兼容的API,但不保证同步,即StringBuilder不是线程安全的,而 ...
- 扯什么kafka顺序消费,然后呢?古尔丹,代价是什么
著名面试八股文之kafka为什么读写效率高,写的答案之一是partition顺序写,因而能保证分区内的不连续的有序性. 这里的重点是有序追加到磁盘,而不是严格意义上的完全有序性. 几年前参加了一大数据 ...
- Navicat Premium 16 安装教程
使用数据库时经常会使用到Navicat,码一个教程 转载自https://www.bilibili.com/read/cv21586676?spm_id_from=444.41.list.card_a ...
- CTFShow 反序列化 Web 255-266
CTFShow 反序列化 255-266 漏洞原理 未队用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等后果. 触发条件 unserialize ...
- python的docker环境配置
docker环境配置 Docker基本操作指令, 下载安装参考 https://duoke360.com/tutorial/docker/install-docker docker + flask + ...