模式错误:悬空元字符

时间:2012-07-22 14:05:58

标签: java regex

我想构建一个模式来将逗号插入整数以使其看起来很好,比如1234556,在操作之后,它会像1,234,556一样,所以我使用以下代码:

public static void insertCommaFormly(int n)
    {
        String input = String.valueOf(n);
        String regex = "(?<=\\d)(?=(?:\\d{3},?)+$)";
        /*or we can use negative look-around*/
        regex = "(?<=\\d)(?=\\d{3}++\\b)";
        String replacement = ",";
        StringBuffer buffer = new StringBuffer();
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        logger.info("Target string is :" + input );
        logger.info("Use regex :" + regex);

        while(matcher.find())
        {
            matcher.appendReplacement(buffer, replacement);
            logger.info(String.format("Part : '%s'", buffer));
        }
        matcher.appendTail(buffer);

        logger.info("After replace , the string is like : " + buffer.toString());
    } 

然而,它给我一个错误(I don't know the reason!):

Dangling meta character '+' near index 16
(?<=\d)(?=\d{2}++\b)
                ^

但如果我使用(?<=\\d)(?=\\d{3}+\\b),则编译器不会向我投诉,但是,如果我使用1234,556,它会给我错误的结果I don't know why results in this ?(?<=\\d)(?=(?:\\d{3})+\\b))那么这将是正确的结果。

  So here are my two questions , please help me with these , thanks in advance!

3 个答案:

答案 0 :(得分:1)

为什么不使用现成的DecimalFormat类来为你编写逗号?见this question

'悬空元字符'错误是因为'+'在正则表达式中具有特殊含义(前一个字符的一次或多次出现),如果删除第二个'+'则应该有效。

答案 1 :(得分:1)

\d{3}++中,{3}是一个量词,正好是三个,而第一个+使量词占有,这在语法上是有效的,但无意义。但第二个+毫无意义;它不能作为量词或占有性修饰符,这就是你获得该例外的原因。

您要做的是匹配一个后跟一些数字的位置,其中位数是三的倍数 - 或者,可以表示为正则表达式,一个或更多三位数组

(?=(?:\d{3})+)

如果您愿意,可以添加第二个+以使其具有占有性 - (?=(?:\d{3})++) - 但它不会改变结果,也不会对性能产生明显影响。顺便说一句,你不必真正使用appendReplacement()appendTail()来完成这项工作:

return String.valueOf(n).replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");

......工作正常。

答案 2 :(得分:0)

可以使用DecimalFormat类:

    int i = 1234556;
    DecimalFormat df = new DecimalFormat("###,###");
    String result = df.format(i);
    System.out.println(result);