【问题标题】:Pattern Error: Dangling meta character模式错误:悬空元字符
【发布时间】:2012-07-21 00:05:56
【问题描述】:

我想建立一个模式,在整数中插入逗号,让它看起来不错,比如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)
                ^

但是如果我使用(?&lt;=\\d)(?=\\d{3}+\\b),编译器不会给我抱怨,但是,它会给我错误的结果1234,556(I don't know why results in this ?),如果我使用(?&lt;=\\d)(?=(?:\\d{3})+\\b),那将是正确的结果.

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

【问题讨论】:

    标签: java regex


    【解决方案1】:

    为什么不使用现成的 DecimalFormat 类来为您输入逗号?见this question

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

    【讨论】:

    • 我只是想了解更多关于模式的知识,而不仅仅是这个功能!
    【解决方案2】:

    可以使用DecimalFormat 类:

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

    【讨论】:

      【解决方案3】:

      \d{3}++ 中,{3} 是一个量词,正好表示三个,而第一个+ 使量词具有所有格,这在语法上是有效的,但毫无意义。但是第二个+ 一点意义都没有;它不能用作量词或所有格修饰符,这就是您遇到该异常的原因。

      你想要做的是匹配一个后面跟着一些数字的位置,其中数字的数量是三的倍数——或者,在可以表示为正则表达式的术语中,一或更多的三位数组

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

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

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

      ...工作得很好。

      【讨论】:

      • 是的,我详细查看了jdk,它描述如你所说!谢谢。
      猜你喜欢
      • 2010-10-29
      • 2013-05-30
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多