Error de patrón: metacarácter colgante

Quiero construir un patrón para insertar una coma en un entero para que se vea bien 1234556, después de manipular, será así 1,234,556, así que utilizo el siguiente código:

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());
    } 

Sin embargo, me da un error ( I don't know the reason!):

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

pero si lo uso (?<=\\d)(?=\\d{3}+\\b), el compilador no me dará una queja, sin embargo, me da el resultado incorrecto 1234,556( I don't know why results in this ?), si lo uso (?<=\\d)(?=(?:\\d{3})+\\b), sería el resultado correcto.

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

En \d{3}++, el {3}es un cuantificador que significa exactamente tres, y el primero +hace que el cuantificador sea posesivo, lo que es sintácticamente válido, aunque no tenga sentido. Pero el segundo +no tiene ningún sentido; no puede servir como cuantificador o modificador posesivo, por lo que obtienes esa excepción.

Lo que intenta hacer es hacer coincidir una posición seguida de algunos dígitos, donde el número de dígitos es un múltiplo de tres o, en términos que se pueden expresar como una expresión regular, uno o más grupos de tres dígitos :

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

Puede agregar un segundo +para que sea posesivo si lo desea, (?=(?:\d{3})++)pero no cambiará los resultados y no tendrá un efecto notable en el rendimiento. Por cierto, realmente no tienes que usar appendReplacement()y appendTail()para este trabajo:

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

... funciona bien.

Respuesta: 2

¿Por qué no usar la clase DecimalFormat ya preparada que pondrá las comas por usted? Ver esta pregunta

El error 'colgar metacarácter' se debe a que '+' tiene un significado especial dentro de una expresión regular (una o más apariciones del carácter anterior), si elimina el segundo '+' debería ser válido.

Respuesta: 3

Posible duplicado: ¿Las clases de tabla de Hibernate deben ser serializables? Puedo realizar cualquier operación CRUD usando Hibernate en Java y mi clase de entidad no necesita implementar una interfaz serializable. ...

el compilador de Java arroja automáticamente un valor char en un int, un código como este no generará un error: public void foo (int i) {// do something} char c = 'a'; foo (c); ¿Hay alguna manera de parar ...

Como típicamente las clases se construyen proporcionando 0 o más parámetros iniciales, suena natural usar inyección de instancia. ¿Cuándo queremos vincular una clase a una subclase en lugar de una instancia de ...

Estoy tratando de usar el mecanismo de copia de seguridad programada de GAE pero sigo recibiendo un mensaje de error que cron.xml tiene un error de sintaxis. El mismo mensaje de error aparece usando las muestras de Google. Estoy usando SDK ...