如何将字符串中的所有数字移动到字符串的开头?

13

对于以下字符串:

String str="asd14sd67fgh007";

我希望得到如下输出:

1467007asdsdfgh

我知道如何分割字符串,但不知道如何获得这个。关于分割,我的代码如下:

public static void main(String[] args) {
    String str="asd14sd67fgh007";
    Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
    Matcher matcher = pattern.matcher(str);
    for(int i = 0 ; i < matcher.groupCount(); i++) {
        matcher.find();
        System.out.println(matcher.group());
    }
}

6
不使用正则表达式会不会更容易?只需扫描字符并将它们分成两个单独的“StringBuilder”即可。 - Kayaman
4个回答

29

2 replaceAll() 可以完成这一任务(如果你真的想使用正则表达式的话:P):


public static void main(String[] args) {
        String s= "asd14sd67fgh007";
        String correctedString = s.replaceAll("\\D+", "") + s.replaceAll("\\d+", "");
        System.out.println(correctedString);
}
1467007asdsdfgh

注意:

"\\D+" ==> 用""替换所有非数字字符(将给出所有数字)。

"\\d+" ==> 用""替换所有数字(将给出所有非数字字符)。


4
@Chanakya - Ywc. 但这种方法会比其他方法慢一些 :) (翻译说明:尽量保持原句结构和意思不变,使其更通俗易懂,同时不添加解释或其他内容。) - TheLostMind
2
嗯,我的意思是代码会变得不太清晰,但我猜你可以添加注释并适当命名方法 ;) - Kayaman

16

以下是使用 char[]StringBuilder 的简单解决方案:

String input = "asd14sd67fgh007";
StringBuilder output = new StringBuilder();
// temporary, for storing alphabetic characters
StringBuilder temp = new StringBuilder();
// iterating input's characters one by one
for (char c: input.toCharArray()) {
    // digits, go to output in their order
    if (Character.isDigit(c)) {
        output.append(c);
    }
    // letters, go to temporary to be appended later
    else if (Character.isAlphabetic(c)){
        temp.append(c);
    }
    // punctuation gets lost
}
// appending temporary alphabetics to digits and printing
System.out.println(output.append(temp));

输出

1467007asdsdfgh

1
啊,我没考虑到#isDigit。太好了。 - gonzo
1
这可能是最快的解决方案 :P +1 - TheLostMind
1
@VinodMadyalkar 也有一种聪明的方式,这是我从未想过的。 - gonzo
1
@VinodMadyalkar,是的,你也很棒 :) - Mena
1
需要注意的是,isDigit 方法除了匹配 '0'-'9' (ISO-LATIN-1) 以外,还会匹配许多其他 Unicode 数字范围。 - Bob
显示剩余2条评论

9
您可以像这样做。在循环遍历所有char时,使用StringBuilder来跟踪前面和后面。
String str="asd14sd67fgh007";
StringBuilder front = new StringBuilder(str.length());
StringBuilder back = new StringBuilder(str.length());
for (char c : str.toCharArray()){
    if (c>=48 && c<=57){ //If numeric
        front.append(c);
    }else{
        back.append(c);
    }
}
front.append(back.toString());
System.out.println(front.toString());

输出

1467007asdsdfgh

嗯,看起来这个比Mena的快 :) - TheLostMind
@VinodMadyalkar 想知道是否因为代码检查了两个条件而不是一个?如果输入字符串是字母数字,Mena可以将 else if 更改为 else - gonzo
1
Character.isDigit() 实际上会进行 4 到 5 次内部调用来返回 true 或 false。isAlphabetic() 也不是简单的。 - TheLostMind
1
在编程中,将字符串构建器的大小设置为输入字符串的长度可能是一个不错的主意,这样可以避免重新分配内存空间。 - plugwash
@plugwash 谢谢你的建议。我已经更新了我的解决方案以反映这一点。 :) - gonzo

0
如果不强制使用正则表达式,您可以使用循环来实现输出:
    String str = "asd14sd67fgh007";
    String digits = "", characters = "";

    for (int i = 0; i < str.length(); ++i) {
        if (Character.isDigit(str.charAt(i))) {
            digits += str.charAt(i);
        } else {
            characters += str.charAt(i);
        }
    }

    System.out.println("Result is :" + digits + characters);

5
如果输入的字符串很大,每次构建字符串都可能变得很昂贵。我建议使用 StringBuilder - gonzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接