我想构建一个模式,将逗号插入整数以使其看起来像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,556I 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!

最佳答案

\d{3}++中,{3}是一个量词,恰好意味着三个,第一个+使该量词具有所有格,这在语法上是有效的,但是毫无意义。但是第二个+毫无意义。它不能用作量词或所有格修饰符,这就是为什么您会得到该异常的原因。

您想要做的是匹配一个位置,该位置后跟一些数字,其中数字的数量是三的倍数;或者,就可以表示为正则表达式而言,是一个或多个三位数的组:

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


如果愿意,您可以添加第二个+使其具有所有格-(?=(?:\d{3})++)-但它不会改变结果,也不会对性能产生明显影响。顺便说一下,您实际上不必为此作业使用appendReplacement()appendTail()

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


...工作正常。

08-25 09:11