我有一串数字。我需要将这些数字分组为长度为3的块,并用单个破折号分隔。如有必要,最后一个块或最后两个块的长度为2。
String abc = "12-10 23 5555 8361";
String hello = abc.replaceAll("[^a-zA-Z0-9]", "");
现在,我如何将它们分组为长度为3的块?
预期结果是
121-023-555-583-61
答案 0 :(得分:3)
您可以在基于lookbehind的正则表达式中使用\G
:
String abc = "12-10 23 5555 8361";
String hello = abc.replaceAll("[^a-zA-Z0-9]", "");
System.out.println(hello.replaceAll("(?<=\\G\\d{3})", "-"));
// => 121-023-555-583-61
请参阅IDEONE demo
(?<=\\G\\d{3})
正则表达式只包含零宽度断言,该断言匹配字符串开头的位置或最后一次成功匹配(\G
)的结尾,后跟3位数( \d{3}
)。在Java正则表达式中,这种模式在当前场景中运行良好(即\G
从后向内移动正则表达式索引)。虽然这在Android中不起作用。
<强>更新强>:
对于更新的要求,您可以使用几步法,如
public static void main (String[] args) throws java.lang.Exception
{
String s = "0 - 22 1985--324"; // => 022-198-53-24
run(s);
s = "555372654"; // => 555-372-654
run(s);
s = "12-10 23 5555 8361"; // => 121-023-555-583-61
run(s);
}
public static void run(String abc) {
String hello = abc.replaceAll("[^a-zA-Z0-9]", "");
hello = hello.replaceAll("(?<=\\G\\d{3})(?!$)", "-");
System.out.println(hello.replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3"));
}
正则表达式使用(?!$)
更新,但在字符串末尾的匹配失败。
.replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3")
是必要的,以便在末尾重新排列最后两个数字组:如果有3个或更多数字后跟连字符然后只有1个数字,我们需要在第一个后移动连字符2个数字,并在此连字符后面移动其他数字。
答案 1 :(得分:1)
您还可以将三位数字分组并替换为已捕获的群组和-
。
正则表达式: (\d{3})
替换为:替换为\1-
Java代码
String abc = "12-10 23 5555 8361";
String hello = abc.replaceAll("[^a-zA-Z0-9]", "");
System.out.println(hello.replaceAll("(\\d{3})", "$1-"));
<强> Regex101 Demo 强>
<强> Ideone Demo 强>