Java 模式错误:悬挂元字符

Java 模式错误:悬挂元字符,java,regex,Java,Regex,我想构建一个模式,在整数中插入逗号,使其看起来更漂亮,如1234556,在操作后,它将类似于1234556,因此我使用以下代码: public static void insertCommaFormly(int n) { String input = String.valueOf(n); String regex = "(?<=\\d)(?=(?:\\d{3},?)+$)"; /*or we can use negative look

我想构建一个模式,在整数中插入逗号,使其看起来更漂亮,如
1234556
,在操作后,它将类似于
1234556
,因此我使用以下代码:

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

但是如果我使用
(?为什么不使用现成的DecimalFormat类,它将为您插入逗号?请参阅


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

可以使用
DecimalFormat
类:

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

\d{3}++
中,
{3}
是一个量词,意思正好是三个,第一个
+
使量词具有所有格,这在语法上是有效的,但毫无意义。但是第二个
+
毫无意义;它既不能用作量词,也不能用作所有格修饰语,这就是为什么你会得到这个例外

您要做的是匹配一个后跟一些数字的位置,其中数字的数量是三的倍数——或者,用正则表达式表示,一组或多组三位数:

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

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

return String.valueOf(n).replaceAll(“(?我只是想了解更多关于模式的信息,而不仅仅是这个函数!是的,我详细地研究了jdk,它如您所说进行了描述!谢谢。
    int i = 1234556;
    DecimalFormat df = new DecimalFormat("###,###");
    String result = df.format(i);
    System.out.println(result);
(?=(?:\d{3})+)
return String.valueOf(n).replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");