用数字作为标记分割字符串

时间:2018-07-09 12:36:52

标签: java

从字符串返回元素直到识别出数字的最优雅方法是什么?

示例:

test213home --> test
234tower --> 
test --> test

另一个问题:

识别数字后从字符串返回元素的最优雅的方法是什么?

示例:

test213home --> 213home
234tower --> 234tower
test --> 

4 个答案:

答案 0 :(得分:4)

您不应以“优雅的方式”进行编码。您可以采用简单的解决方案(意味着易于编写/读取/维护(不一定在所有情况下都尽可能快),也可以采用满足您的要求(大小,速度等)的解决方案。

可能有一个简单的解决方案(根据您的示例)

String[] strings = { "test213home", "234tower", "test", "foo42bar23"};
for (String string : strings) {
    String first = string.replaceFirst("^([^\\d]*).*", "$1");
    String last = string.replaceFirst("^[^\\d]*(.*)", "$1");
    System.out.printf("value: %-11s   first: %-4s   last: %s%n", string, first, last);
}

输出

value: test213home   first: test   last: 213home
value: 234tower      first:        last: 234tower
value: test          first: test   last: 
value: foo42bar23    first: foo    last: 42bar23

关于正则表达式的解释,建议您阅读Java tutorial about "Regular Expressions"

编辑在评论中找到您的问题的片段。

String[] strings1 = { "12345test123", "test123abc"};
for (String string : strings1) {
    String first = string.replaceFirst("^([^\\d]*[\\d]*).*", "$1");
    String last = string.replaceFirst("^[^\\d]*[\\d]*(.*)", "$1");
    System.out.printf("value: %-12s   first: %-7s   last: %s%n", string, first, last);
}

输出

value: 12345test123   first: 12345     last: test123
value: test123abc     first: test123   last: abc

答案 1 :(得分:0)

这就是您要寻找的:

String [] parts = str.split("\\d+")

答案 2 :(得分:0)

对于第一个问题,该功能有效:

String  getSubstringUntilFirstNumber(String source) {
    return source.split("[0-9]")[0];
}

答案 3 :(得分:0)

这是一种非正则表达式方法,其中您在字符串中搜索数字的索引(如果有的话)。然后,您只需得到substring的结果即可。如果找不到数字,请注意三元选择。

public class StackOverflow {
    public static void main(String[] args) {
        String[] data = { "test213home", "234tower", "test", "foo42bar23" };
        for (String d : data) {
            System.out.println("Before digit: " + beforeDigit(d));
            System.out.println("After digit : " + afterDigit(d));
            System.out.println("");
        }
    }

    private static String beforeDigit(String data) {
        int index = findDigitIndex(data);
        return index > -1 
            ? data.substring(0, index)
            : data.substring(0);
    }

    private static String afterDigit(String data) {
        int index = findDigitIndex(data);
        return index > -1
            ? data.substring(index)
            : data.substring(0);
    }

    private static int findDigitIndex(String data) {
        int index = -1;
        for (int i = 0; i < data.length(); i++) {
            if (Character.isDigit(data.charAt(i))) {
                index = i;
                break;
            }
        }

        return index;
    }
}

结果:

Before digit: test
After digit : 213home

Before digit: 
After digit : 234tower

Before digit: test
After digit : test

Before digit: foo
After digit : 42bar23