服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - JAVA获取字符串内的括号对;获取括号对的内容;按指定规则返回括号对位置;

JAVA获取字符串内的括号对;获取括号对的内容;按指定规则返回括号对位置;

2023-08-30 01:19未知服务器之家 Java教程

先看结果:处理字符串  " 这个是一条测试用的字符串[ ( 5 ( 4( 3 [(1) (2)] ))(7))][(6)] " 结果    解决思路:参考正则表达式里面出入站部分  代码实现如下: 方法调用“:  String test = "这个是一条测试用的字符串[ ( 5( 4( 3 [(1) (2)] ))(

先看结果:处理字符串 

"这个是一条测试用的字符串[  ( 5 ( 4( 3 [(1) (2)] ))(7))][(6)]"

结果   

JAVA获取字符串内的括号对;获取括号对的内容;按指定规则返回括号对位置;

解决思路:参考正则表达式里面出入站部分

JAVA获取字符串内的括号对;获取括号对的内容;按指定规则返回括号对位置;

 代码实现如下:

方法调用“: 

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教程Java描述数据结构学习之链表的增删改查详解

    Java描述数据结构学习之链表的增删改查详解

    这篇文章主要给大家介绍了关于Java描述数据结构学习之链表的增删改查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的...

    tosser11892021-05-03
  • Java教程简单谈谈java自定义注解

    简单谈谈java自定义注解

    下面小编就为大家带来一篇简单谈谈java自定义注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java教程网19382020-12-02
  • Java教程Spring Boot 简介(入门篇)

    Spring Boot 简介(入门篇)

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。下面通过本文给大家介绍spring boot相关知识,需要的...

    Java之家3172020-09-17
  • Java教程Java如何基于command调用openssl生成私钥证书

    Java如何基于command调用openssl生成私钥证书

    这篇文章主要介绍了Java如何基于command调用openssl生成私钥证书,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    护花使者5902020-08-05
  • Java教程Java 基础语法之解析 Java 的包和继承

    Java 基础语法之解析 Java 的包和继承

    包是组织类的一种方式,继承顾名思义,比如谁继承了长辈的产业,其实这里的继承和我们生活中的继承很类似,下面文字将为大家详细介绍Java的包和继承...

    吞吞吐吐大魔王8592021-12-31
  • Java教程Spring boot定时任务的原理及动态创建详解

    Spring boot定时任务的原理及动态创建详解

    这篇文章主要给大家介绍了关于Spring boot定时任务的原理及动态创建的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    HJZ8172021-07-18
  • Java教程Mybatis中#{}和${}传参的区别及#和$的区别小结

    Mybatis中#{}和${}传参的区别及#和$的区别小结

    这篇文章主要介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 ...

    mrr4322020-05-25
  • Java教程MongoDB支持的java数据类型和测试例子

    MongoDB支持的java数据类型和测试例子

    这篇文章主要介绍了MongoDB支持的java数据类型和测试例子,MongoDB除了本身自有的数据类型外,还为较流行的编程语言定制了该语言的数据类型,需要的朋友可以...

    Java教程网5402019-11-23