如何在不事先知道拆分字符的情况下拆分字符串?

insrf1ej  于 2021-07-11  发布在  Java
关注(0)|答案(3)|浏览(322)

对于我的项目,我必须阅读各种输入图。不幸的是,输入边的格式不同。有些是逗号分隔的,有些是制表符分隔的,等等。例如:
文件1:

123,45
67,89
...

文件2

123    45
67    89
...

我不想单独处理每个案例,而是想自动检测拆分字符。目前我开发了以下解决方案:

String str = "123,45";
String splitChars = "";
for(int i=0; i < str.length(); i++) {
    if(!Character.isDigit(str.charAt(i))) {
      splitChars += str.charAt(i);
   }
}

String[] endpoints = str.split(splitChars);

基本上,我选择第一行并选择所有非数字字符,然后使用生成的子字符串作为拆分字符。有没有更干净的方法?

gv8xihay

gv8xihay1#

把绳子分开 \\D+ 表示一个或多个非数字字符。
演示:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // Test strings
        String[] arr = { "123,45", "67,89", "125      89", "678 129" };
        for (String s : arr) {
            System.out.println(Arrays.toString(s.split("\\D+")));
        }
    }
}

输出:

[123, 45]
[67, 89]
[125, 89]
[678, 129]
h6my8fg2

h6my8fg22#

split需要一个regexp,所以您的代码会失败有很多原因:如果分隔符在regexp中有意义(比如, + ),它会失败的。如果有超过1个非数字字符,代码也会失败。如果代码包含的数字超过2个,那么它也会失败。想象一下它包含 hello, world -然后你的splitchars字符串变成 " , " -而你的分裂将什么也做不到(那将分裂字符串) "test , " 一分为二,没有别的)。
为什么不做一个regexp来获取数字,然后找到所有的数字序列,而不是集中在分隔符上呢?
不管您愿意与否,您都在使用regexps,所以让我们正式使用它并使用模式。

private static final Pattern ALL_DIGITS = Pattern.compile("\\d+");

// then in your split method..

Matcher m = ALL_DIGITS.matcher(str);
List<Integer> numbers = new ArrayList<Integer>();
// dont use arrays, generally. List is better.
while (m.find()) {
    numbers.add(Integer.parseInt(m.group(0)));
}
``` `//d+` 是:任意位数。 `m.find()` 查找下一个匹配项(即下一个数字块),如果没有匹配项,则返回false。 `m.group(0)` 检索整个匹配的字符串。
juzqafwq

juzqafwq3#

为什么不用[^\d]+(每组非IGnit)拆分:

for (String n : "123,456 789".split("[^\\d]+")) {
        System.out.println(n);
    }

结果:

123
456
789

相关问题