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

前端之家收集整理的这篇文章主要介绍了正则表达式 匹配罗马数字 并且返回匹配到的值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

猜你在找的正则表达式相关文章