Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不事先知道拆分字符的情况下拆分字符串?_Java_String_Split - Fatal编程技术网

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

Java 如何在不事先知道拆分字符的情况下拆分字符串?,java,string,split,Java,String,Split,对于我的项目,我必须阅读各种输入图。不幸的是,输入边的格式不同。其中一些是逗号分隔的,其他是制表符分隔的,等等。例如: 文件1: 123,45 67,89 ... 文件2 123 45 67 89 ... 我希望自动检测拆分字符,而不是单独处理每个案例。目前,我开发了以下解决方案: String str = "123,45"; String splitChars = ""; for(int i=0; i < str.length();

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

文件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);
String str=“123,45”;
字符串splitChars=“”;
对于(int i=0;i

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

拆分需要一个regexp,因此您的代码将失败,原因有很多:如果分隔符在regexp中有意义(比如,
+
),它将失败。如果有超过1个非数字字符,代码也将失败。如果您的代码包含的数字超过2个,它也将失败。假设它包含
hello,world
-然后您的splitChars字符串变为
,“
”,您的拆分将不起任何作用(这将把字符串
“test,abc”
拆分为两个,没有其他作用)

为什么不制作一个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)));
}
private static final Pattern ALL\u DIGITS=Pattern.compile(\\d+);
//然后用你的分割法。。
匹配器m=所有数字。匹配器(str);
列表编号=新的ArrayList();
//通常不要使用数组。这张单子比较好。
while(m.find()){
add(Integer.parseInt(m.group(0));
}
//d+
是:任意位数

m.find()
查找下一个匹配项(即下一个数字块),如果没有更多匹配项,则返回false


m.group(0)
检索整个匹配字符串。

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

结果:

123
456
789

拆分
\\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]
输出:

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]

我认为您的实现只能在非常特定的情况下工作,其中行正好包含由单个分隔符分隔的两个数字。如果输入保证符合该标准,则这不是问题,但是如果存在哪怕是最微小的变化,则需要更复杂的方案。