我想构建一个模式,将逗号插入整数以使其看起来像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!
最佳答案
在\d{3}++
中,{3}
是一个量词,恰好意味着三个,第一个+
使该量词具有所有格,这在语法上是有效的,但是毫无意义。但是第二个+
毫无意义。它不能用作量词或所有格修饰符,这就是为什么您会得到该异常的原因。
您想要做的是匹配一个位置,该位置后跟一些数字,其中数字的数量是三的倍数;或者,就可以表示为正则表达式而言,是一个或多个三位数的组:
(?=(?:\d{3})+)
如果愿意,您可以添加第二个
+
使其具有所有格-(?=(?:\d{3})++)
-但它不会改变结果,也不会对性能产生明显影响。顺便说一下,您实际上不必为此作业使用appendReplacement()
和appendTail()
:return String.valueOf(n).replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");
...工作正常。