将一个字符串拆分成三个块?

时间:2016-03-29 19:34:21

标签: java regex string split

我有一串数字。我需要将这些数字分组为长度为3的块,并用单个破折号分隔。如有必要,最后一个块或最后两个块的长度为2。

    String abc = "12-10 23 5555 8361";
    String hello = abc.replaceAll("[^a-zA-Z0-9]", "");

现在,我如何将它们分组为长度为3的块?

预期结果是

121-023-555-583-61

2 个答案:

答案 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"));
}

请参阅another IDEONE demo

正则表达式使用(?!$)更新,但在字符串末尾的匹配失败。

.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