【问题标题】:Why there are empty string while trying to split a string in Java? And how to fix it?为什么尝试在 Java 中拆分字符串时出现空字符串?以及如何解决?
【发布时间】:2020-02-22 08:53:00
【问题描述】:

我正在尝试像这样拆分字符串:

stringNumbers = "12.34+345.56+45-87.90*43.00";
String[] Operators = stringNumbers.split("[0-9.]");

当我打印操作符时,在控制台中我得到了这个:

[, , , , , +, , , , , , +, , -, , , , , *]

空字符不是我想要的输出。为什么我得到空字符以及如何解决这个问题?

【问题讨论】:

  • 请注意:它们不是空字符,而是空字符串(“”)。
  • 我认为这个网站不欢迎新来者。我不明白为什么会有这么多反对票?

标签: java arrays regex string java-8


【解决方案1】:

因为你是按一个字符来分割的,所以你必须急切地这样做:

String[] Operators = stringNumbers.split("[0-9.]*");

或者你可以过滤结果:

String[] Operators = Arrays.stream(stringNumbers.split("[0-9.]"))
    .filter(str -> !str.equals(""))
    .toArray(String[]::new);

【讨论】:

  • stringNumbers.split("[0-9.]*");也打印几个空字符,过滤它们修复它。谢谢。
  • @tanvirgeek 没问题,考虑标记为正确;>
  • 使用 "[0-9.]+" 会更好,但是,仍然需要过滤器来删除第一个空字符串。
  • 为什么打印空字符?字符串中的每个字符之间是否有空字符?
  • 第一个和最后一个来自正则表达式开始/启用字符串。查看stackoverflow.com/questions/32675757/…
【解决方案2】:

另一种选择是只收集这些数字,用一个简单的表达式,例如:

\\d+(?:\\.\\d+)?

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\d+(?:\\.\\d+)?";
        final String string = "12.34+345.56+45-87.90*43.00\n"
             + "12+345+45.8-87*43";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }

    }
}

输出

Full match: 12.34
Full match: 345.56
Full match: 45
Full match: 87.90
Full match: 43.00
Full match: 12
Full match: 345
Full match: 45.8
Full match: 87
Full match: 43

如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。


正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

    【解决方案3】:
    String stringNumbers = "12.34+345.56+45-87.90*43.00";
    String[] Operators = Arrays.stream(stringNumbers.split("[0-9.]+"))
                    .filter(str -> !str.equals(""))
                    .toArray(String[]::new);
    

    【讨论】:

    • 既然你的过滤方式和我一样,结果的变化是没有的,那何必呢?
    • 转储stringNumbers.split("[0-9]+")stringNumbers.split("[0-9]") 的结果,你就会知道为什么我会被打扰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2014-05-27
    • 2014-06-29
    相关资源
    最近更新 更多