如何格式化java中的字符串“012df3g4h5j6 78”=> “01 23 45 67 8”

时间:2016-04-21 07:41:57

标签: java regex replace numbers format

我想格式化带有数字和其他字符的字符串: 样品

input =>输出

  • “012df3g4h5j6 78”=> “01 23 45 67 8”
  • “012df3g4h5j6 7”=> “01 23 45 67”
  • “012 3 45 6 78”=> “01 23 45 67 8”
  • “012 3 45 6”=> “01 23 45 6”

我只为数字提供解决方案:

  • “012345678”=> “01 23 45 67 8”
  • “01234567”=> “01 23 45 67”
  • “01234567”=> “01 23 45 67”

regexp =“(?= [0-9] {2})(([0-9]){2})”

replacement =“$ 1”

3 个答案:

答案 0 :(得分:5)

试试这个

(\D*)(\d)(?:(\n)|(\D*)(\d)(\n?))

Regex demo

或者

(\D*)(\d)(?:(\n|$)|(\D*)(\d)((?:\n|$)?))

Demo

<强>解释
( … ):捕获小组sample
\:逃脱一个特殊字符sample
*:零次或多次sample
(?: … ):非捕获组sample
|:替代/或操作数sample
?:一次或无sample

输入:

012df3g4h5j6 78
012df3g4h5j6 7
012 3 45 6 78
012 3 45 6
012345678
01234567
01234567

输出

01 23 45 67 8 
01 23 45 67 
01 23 45 67 8 
01 23 45 6 
01 23 45 67 8 
01 23 45 67 
01 23 45 67 

答案 1 :(得分:2)

您可以分两步完成:

String repl = str.replaceAll("\\D", "").replaceAll("(\\d{2})(?!$)", "$1 ");

在第一步中,我们从字符串中删除所有非数字,在第二步中,我们在除了最后一位之外的每2位数后插入一个空格。

修改

这是一个步骤:

String repl = str.replaceAll("\\D*(\\d)(?!\\d?$)(?:\\D*(\\d))?\\D*", "$1$2 ");

RegEx Demo of 1 step replacement

Working Code Demo

答案 2 :(得分:1)

一个简单的答案(没有正则表达式)将遍历字符串查找数字并创建一个新的字符串,并将它们分组为两个。

String input = ...;
String output = "";
boolean space = false;
for (char c : input.toCharArray()) {
    if (!Character.isDigit(c)) {
        continue;
    }
    output += c;
    if (space) {
        output += ' ';
    }
    space = !space;
}
output = output.trim(); //To remove trailing space if present

如果您认为字符串连接太多,则可以考虑使用StringBuffer