算法基础——2.5正则表达式进阶
发布时间:2020-12-13 23:07:15 所属栏目:百科 来源:网络整理
导读:例一: /* 计算表达式的值(假设只有加法、减法、乘法) 23+15-16*(25+(6-3)+9*2)*/import java.util.regex.*;public class T1{// 计算没有括号的表达式static String calcuNoParen(String s){if(s.length()1) return s;// 先把所有乘法消除Pattern pat = Pa
例一: /* 计算表达式的值(假设只有加法、减法、乘法) 23+15-16*(25+(6-3)+9*2) */ import java.util.regex.*; public class T1 { // 计算没有括号的表达式 static String calcuNoParen(String s) { if(s.length()<1) return s; // 先把所有乘法消除 Pattern pat = Pattern.compile("([0-9]+)*([0-9]+)"); while(true){ Matcher mc = pat.matcher(s); if(mc.find()==false) break; // 已经没有乘法了 int res = Integer.parseInt(mc.group(1)) * Integer.parseInt(mc.group(2)); s = s.replace(mc.group(),res + ""); // 注意这里不能用replaceAll } //再从左到右消除所有加法或减法 pat = Pattern.compile("([0-9]+)([+-])([0-9]+)"); while(true){ Matcher mc = pat.matcher(s); if(mc.find()==false) break; // 已经没有运算符了 int res = 0; if(mc.group(2).equals("+")) res = Integer.parseInt(mc.group(1)) + Integer.parseInt(mc.group(3)); else res = Integer.parseInt(mc.group(1)) - Integer.parseInt(mc.group(3)); s = s.replace(mc.group(),res + ""); // 注意这里不能用replaceAll } return s; } // 计算可能含有括号的表达式 static String calcu(String s) { s = s.replaceAll(" +",""); // 消除空格 Pattern pat = Pattern.compile("(([^()]*))"); while(true){ Matcher mc = pat.matcher(s); if(mc.find()==false) break; // 把括号内先计算,然后消除括号 s = s.replace(mc.group(),calcuNoParen(mc.group(1))); } return calcuNoParen(s); } public static void main(String[] args) { /* String s = "23+15-16*(25+(6-3*2*1)+9*2)"; //任务:找到最内层括号中的内容,计算后替换掉 */ System.out.println(calcu("5 + 3 * 2 * (2+2-3) - 1")); } }例二: /*第02讲-正则表达式进阶_展开串 实际开发中,常常会出现用到一批文件,而这些文件的文件名有某种规律,我们在表述的时候,往往习惯简写,但这样程序又不好识别。 比如: c:/abc/xyz/k[11..19].dat 实际表示的就是: c:/abc/xyz/k11.dat c:/abc/xyz/k12.dat c:/abc/xyz/k13.dat c:/abc/xyz/k14.dat c:/abc/xyz/k15.dat c:/abc/xyz/k16.dat c:/abc/xyz/k17.dat c:/abc/xyz/k18.dat c:/abc/xyz/k19.dat 本题目要求是:给定一个含有简写的串,要求展开为所有文件名。 简写的格式为:[整数..整数]*/ import java.util.regex.*; public class C5 { public static void main(String[] args) { String s = "c:/abc/xyz/k[11..19].dat"; int begin = 0,end = 0; Pattern pat = Pattern.compile("[([0-9]+)..([0-9]+)]"); Matcher mc = pat.matcher(s); if(mc.find()){ begin = Integer.parseInt(mc.group(1));//第一个文件号 end = Integer.parseInt(mc.group(2));//最后一个文件号 for(int i = begin; i <= end; ++i){ System.out.println(s.replaceAll("[([0-9]+)..([0-9]+)]",i+"")); } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |