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

标签 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(); i++) {
    if(!Character.isDigit(str.charAt(i))) {
      splitChars += str.charAt(i);
   }
}
  
String[] endpoints = str.split(splitChars);

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

最佳答案

拆分需要正则表达式,因此您的代码会因多种原因而失败:如果分隔符在正则表达式中有意义(例如,+),它将失败。如果有超过 1 个非数字字符,您的代码也会失败。如果您的代码包含超过 2 个数字,它也会失败。想象一下它包含 hello, world - 然后你的 splitChars 字符串变成 ", " - 你的 split 什么都不做(那会拆分字符串 "test , abc" 一分为二,没有别的)。

为什么不制作一个正则表达式来获取数字,然后找到所有数字序列,而不是专注于分隔符?

无论您愿意与否,您都在使用正则表达式,所以让我们将其正式化并使用模式,而我们正在这样做。

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() 找到下一个匹配项(因此,下一个数字 block ),如果没有匹配项,则返回 false。

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

关于java - 如何在不知道先验拆分字符的情况下拆分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64942463/

相关文章:

java - Eclipse(实际上是 RAD)在项目上抛出 WAR 验证错误(CHKJ3000E)

java - 在java中将图像拼接在一起

c++ - 动态分配的字符串数组

c++ - 有没有办法从 cmd 字符串中复制字符串?

java - 使用拆分提取重叠匹配项

java - 每行分割未知数量的字符串

java - JSOUP 从重定向链接中获取 html 内容

java - 在 Paint Listener 中消除 SWT Canvas 的闪烁

java - 在java中将日期转换为纳秒

r - 将函数应用于相同大小的连续子向量