例一:
- /*
- 计算表达式的值(假设只有加法、减法、乘法)
- 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+""));
- }
- }
- }
- }