为了账号安全,请及时绑定邮箱和手机立即绑定

解析数字字符串时的额外空字符串

解析数字字符串时的额外空字符串

蓝山帝景 2023-05-24 17:40:44
试图仅从此字符串中获取数字。“abcd10efgh20”但是,下面的代码返回一个数组,其中的数字开头为空字符串。["", "10", "20"]String[] nums = s.split("\\D+"); System.out.println(Arrays.toString(nums));期望 ["10", "20"][编辑]我的问题是为什么我在数组的开头得到一个空字符串?不是如何使用正则表达式?从字符串中获取数字序列。如何更好地编码?
查看完整描述

4 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您获得前导空字符串的原因是因为您的定界符(一系列非数字字符)引导字符串。这与以下原因相同:

String s = ",";
String[] splitResult = s.split(",");

愿意splitResult成为["",""]。每有一个分隔符,即使它在字符串的开头或结尾,也是在分割字符串中的两个标记。如果定界符位于字符串的开头、字符串的末尾,或者如果有两个相邻的定界符(由于贪婪量词,在您的情况下不会发生这种情况,但在上述情况下会发生+String s = ",,";,那么拆分结果将有空字符串。

解决问题的一种简单方法是过滤掉空字符串。您知道它只能出现在输入字符串的前面或后面,所以这不是真正的问题。例如:

  • 检查中的第一个和最后一个字符串nums。如果它们是空的,请删除它们。

  • 使用正则表达式搜索数字,而不是按非数字拆分。

  • 在运行代码之前删除任何前导/尾随非数字。

我的 Java 不太流利,但我确信可能有一些更简洁的 Java 习惯用法可以使用您提供的代码来执行此操作。


查看完整回答
反对 回复 2023-05-24
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

String s = "abcd10efgh20dsd2323sdfsdfsdf";

s = s.replaceAll("[aA-zZ]+", ",");


if (s.charAt(0) == ',') { s = s.replaceFirst(",", ""); }

if (s.charAt(s.length()-1) == ',') { s = s.substring(0, s.length()-1); }


String[] nums = s.split(",");


System.out.println(s);

System.out.println(Arrays.toString(nums));


查看完整回答
反对 回复 2023-05-24
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

String str="abcd10efgh20asdasd30";

    str=str.replaceAll("\\D+", ",");

    System.out.println(str);

    if(str.startsWith(","))

    {

        str=str.replaceFirst(",","");

    }

    System.out.println(str);

    System.out.println(Arrays.toString(str.split(",")));


查看完整回答
反对 回复 2023-05-24
?
FFIVE

TA贡献1797条经验 获得超6个赞

为此,我会检查 StringUtils 库: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

假设这是一个学校项目并且外部库不是一个选项,那么这段代码应该适合你:

String s = "abcd10efgh20";

    String[] nums = s.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");

    List<String> realnums = new ArrayList<>();

    for (int i = 0; i < nums.length; i++) {

        if (nums[i].matches("-?\\d+(\\.\\d+)?"))

        {

            realnums.add(nums[i]);

        }

    }

realnums 将包含您的数字 ArrayList。


基本上,您所做的是在字符串的第一部分找到数字时将其拆分,然后遍历该数组并使用正则表达式来确定数组的每个元素是否为数字。如果是,则将其添加到新的 realnums ArrayList。如果不是,则什么也不做。


查看完整回答
反对 回复 2023-05-24
  • 4 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信