这两天楼主处理一个需求 要在很多字符串里面匹配出字符串中的罗马数字 还要取出这些罗马数字进行一系列的操作.在度娘上找了半天也没找到有用信息 还被很多错误的代码误导了 非常痛苦.好在最后各种努力 花了半天时间达到了想要的结果.现在在这里记录并分享一下.如果需要转载 请注明出处 写好传送门.thanks
这里分享一个网站 可以把阿拉伯数字转化为对应的罗马数字 没有上限 好用点赞加分享
http://www.zhongguosou.com/education_graduate_course_tools/roman_numeral_convert.aspx
以下方法就可以取到字符串中的罗马数字,但是也会匹配上空字符串,所以需要后期程序处理
/** * 已经测试成功的取出正则表达式匹配的字符串 * @author erikas * @throws Exception */ @org.junit.Test public 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表示匹配到了结果 但是执行了之后如果后面没有再匹配成功的 会马上变成false System.out.println("here"); String srcStr = matcher.group(); //把取出的结果 放入list list.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; }