正则表达式 匹配罗马数字 并且返回匹配到的值

来源:互联网 发布:简述数据库系统的组成 编辑:程序博客网 时间:2024/05/16 09:12

这两天楼主处理一个需求 要在很多字符串里面匹配出字符串中的罗马数字 还要取出这些罗马数字进行一系列的操作.在度娘上找了半天也没找到有用信息 还被很多错误的代码误导了 非常痛苦.好在最后各种努力 花了半天时间达到了想要的结果.现在在这里记录并分享一下.如果需要转载 请注明出处 写好传送门.thanks


这里分享一个网站 可以把阿拉伯数字转化为对应的罗马数字 没有上限 好用点赞加分享

http://www.zhongguosou.com/education_graduate_course_tools/roman_numeral_convert.aspx


以下方法就可以取到字符串中的罗马数字,但是也会匹配上空字符串,所以需要后期程序处理

/** * 已经测试成功的取出正则表达式匹配的字符串                  * @author erikas         * @throws Exception */@org.junit.Testpublic void testReg() throws Exception {String str = "";//匹配罗马数字的正则,但是由于每一个都可能是0个 空字符串也会被匹配出来 需要后期在程序里再处理String regex = "(-| +|^)M{0,9}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})( +|$)"; Pattern p = Pattern.compile(regex);Matcher matcher = p.matcher(str);List<String> list = new ArrayList<String>();while (matcher.find()) {//matcher.find()返回true表示匹配到了结果 但是执行了之后如果后面没有再匹配成功的 会马上变成falseSystem.out.println("here");String srcStr = matcher.group();//把取出的结果 放入listlist.add(srcStr);}System.out.println(list);}

以下方法用于把罗马数字转换为对应的阿拉伯数字.

 //罗马数字转阿拉伯数字:    // 从前往后遍历罗马数字,如果某个数比前一个数小,则把该数加入到结果中;    // 反之,则在结果中两次减去前一个数并加上当前这个数;    // I、V、X、   L、   C、     D、     M    // 1.5、10、50、100、500、1000    private static int r2a(String in){        int graph[] = new int[400];        graph['I'] = 1;        graph['V']=5;        graph['X']=10;        graph['L']=50;        graph['C']=100;        graph['D']=500;        graph['M']=1000;        char[] num = in.toCharArray();        // 遍历这个数,用sum来总计和        int sum = graph[num[0]];        for(int i=0; i<num.length-1; i++){            // 如果,i比i+1大的话,直接相加            if(graph[num[i]] >= graph[num[i+1]]){                sum += graph[num[i+1]];            }            // 如果i比i+1小的话,则将总和sum减去i这个地方数的两倍,同时加上i+1            // 就相当于后边的数比左边的数大,则用右边的数减左边的数            else{                sum = sum + graph[num[i+1]] - 2*graph[num[i]];            }        }        return sum;    }


0 0