最近工作需要,要截取一个sql中某个函数,刚好这个函数有括号,将此函数截掉,写了个匹配括号的程序,主要是基于字符串的索引写的
package com.cai.test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author * * 2016年8月21日 */ public class Bracket { public static void main(String[] args) { Bracket bracket = new Bracket(); String sql = "SELECT Flt_Dpt_Dt" + " ,CASE WHEN Lane_Area IN ('港澳','台湾' ) THEN '港澳台' " + " ELSE Lane_Area " + " END AS Flt_Duty_Area " + " ,SUM (Total_Cap_Qty*Seg_Distance) AS ASK " + " FROM " + " (SELECT *" + " FROM PV_MART.ITM_FLIGHT_BASE T1" + " WHERE Lane_Type = '国际'" + " AND Leg_Ind <>'N'" + " AND (Flt_Dpt_Dt >=DATE '2014-01-01')" + " QUALIFY ROW_NUMBER() OVER(PARTITION BY Carrier_Cd,Flt_Dpt_Dt,Flt_Nbr,Lane_Area,Orig_Airport_Cd,Dest_Airport_Cd ORDER BY Dcp_Dt ) =1) T1 GROUP BY 1,2"; sql = bracket.formatStrBackspace(sql.replaceAll("QUALIFY ROW_NUMBER\\(\\)", "")); int index = sql.indexOf("OVER(") + 4; //System.out.println(index); String str = "(()()((()())))"; Map<Integer, Integer> bracketIndex = bracket.bracketIndex(sql); // System.out.println(bracketIndex); System.out.println(sql.substring(index-4, bracketIndex.get(index)+1)); } /** * 对字符串的括号进行配对 * 将字符的左括号和右括号索引进行存储,然后遇见右括号取出 * 步骤: * 将字符串先进行格式化,多个空格的用单个空格替换 * 根据括号规则分析可知:(()(()())) * 先取内部括号,后取外部括号 * @param str 字符创 * @param s 匹配的字符 */ public Map<Integer, Integer> bracketIndex(String str) { Map<Integer, Integer> indexMap = new HashMap<Integer, Integer>(); List<Integer> leftList = new ArrayList<Integer>(); List<Integer> rightList = new ArrayList<Integer>(); str = formatStrBackspace(str); char[] chs = str.toCharArray(); for (int i=0;i<chs.length;i++) { if(chs[i] == '(') { leftList.add(i); } else if(chs[i] == ')') { rightList.add(i); } } //42, 107, 150, 237, 288, 295 53, 134, 268, 289, 397, 401 一次后的结果为 150 if(leftList.size() == rightList.size()) { int size = leftList.size(); //取出内部括号匹配索引,一对括号的右括号必定在前后两个左括号中间 outter:for(int j=0;j<size;) { inner:for (int i=0;i<size;i++) { if(i+1<size) { if(rightList.get(j) > leftList.get(i) && rightList.get(j) < leftList.get(i+1)) { indexMap.put(leftList.get(i), rightList.get(j)); leftList.remove(i); rightList.remove(j); size--; break inner; } } else { break outter; } } } //最后剩余的括号则为外括号,里外对应即可 if(size > 0) { for(int i=0;i<size;i++) { indexMap.put(leftList.get(i), rightList.get(size-(i+1))); } } } return indexMap;//288=289, 237=268, 295=397, 42=53, 107=134, 150=401 } public String formatStrBackspace(String str) { return str.replaceAll(" +", " "); } }
如果有更好的方法,请提出好的意见。
相关推荐
看到大家对括号匹配问题很感兴趣, 再发一个用Java编写的括号匹配程序+实验报告, Funtion: 来检测C语言程序中的简单语法错误。例如:不配对的圆括号、方括号和花括号。并注意单引号、双引号和注释段的处理。
括号匹配java源代码 在文本处理经常要用的小程序
Java 栈Stack源码实现 stack检测括号匹配算法 java源码
主要介绍了Java栈的应用之括号匹配算法,结合实例形式分析了Java使用栈实现括号匹配算法的相关原理、操作技巧与注意事项,需要的朋友可以参考下
自己为java IDE写的java编辑器,仿制notepad2. 可实现代码染色、括号匹配、书签标注、编辑辙销、文本查找等基本功能。 非所见所得,没有加入文件处理功能。
自己做的,能用栈实现括号匹配,程序很简单实用
利用stack数据结构实现,左右括号序列的匹配
数据结构(Java语言描述) 案例07 括号匹配的检查.docx 学习资料 复习资料 教学资源
数据结构实验括号匹配,本例子是堆栈实现括号匹配的
【免费题库】华为OD题库C卷 - 表达式括号匹配(Java 代码+解析).html
【免费题库】华为OD机试 - 括号匹配(Java & JS & Python & C & C++).html
一个表达式中包括变量、常量、操作符、圆括号,圆括号可以嵌套, 编写程序判断表达式中的括号是否正确匹配。输入任意一个表达式,判断其中括号是否匹配,匹配, 输出OK, 不匹配,输出NO。(表达式的长度小于50)
【免费题库】华为OD机试 - 表达式括号匹配(Java & JS & Python & C & C++).html付费专栏内容,免费下载,多种语言解法
public class kuohao{ public static void main(String[] args){ String str = "{}{[]()()}"; char[] ch = str.toCharArray();
本文实例讲述了Python实现求解括号匹配问题的方法。分享给大家供大家参考,具体如下: 这个在本科学习数据结构的时候已经接触很多了,主流的思想是借助栈的压入、弹出来进行匹配,至于python的话可以使用列表来完成...
题目描述: 给定一个只包括 '(',')','{','}','[',']'...括号匹配是一个很明显的使用栈解决的问题 import java.util.Stack; class Solution { public boolean isValid(String s) { Stack stack = new Stack();
用于输入不规则序列的括号,进行匹配计数,最终得出匹配输出yes,不匹配输出no
//匹配大括号 private static String regexx = "\\(([^}]*)\\)";//匹配小括号 public static void main(String[] args) { String dakuohao = "{a+b}={c+d}>{d}"; Pattern compile = Pattern.compile(regex); ...
可以进行多重括号运算,但括号要匹配,没有自带纠错功能。另外,没有对小数的识别。。。
主要介绍了Java正则提取中括号中的内容操作,涉及Java针对字符串的正则匹配、转换、遍历等相关操作技巧,需要的朋友可以参考下