Java 如何在不事先知道拆分字符的情况下拆分字符串?
对于我的项目,我必须阅读各种输入图。不幸的是,输入边的格式不同。其中一些是逗号分隔的,其他是制表符分隔的,等等。例如: 文件1: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();
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]
我认为您的实现只能在非常特定的情况下工作,其中行正好包含由单个分隔符分隔的两个数字。如果输入保证符合该标准,则这不是问题,但是如果存在哪怕是最微小的变化,则需要更复杂的方案。