4 回答
TA贡献1895条经验 获得超7个赞
您获得前导空字符串的原因是因为您的定界符(一系列非数字字符)引导字符串。这与以下原因相同:
String s = ","; String[] splitResult = s.split(",");
愿意splitResult
成为["",""]
。每有一个分隔符,即使它在字符串的开头或结尾,也是在分割字符串中的两个标记。如果定界符位于字符串的开头、字符串的末尾,或者如果有两个相邻的定界符(由于贪婪量词,在您的情况下不会发生这种情况,但在上述情况下会发生+
)String s = ",,";
,那么拆分结果将有空字符串。
解决问题的一种简单方法是过滤掉空字符串。您知道它只能出现在输入字符串的前面或后面,所以这不是真正的问题。例如:
检查中的第一个和最后一个字符串
nums
。如果它们是空的,请删除它们。使用正则表达式搜索数字,而不是按非数字拆分。
在运行代码之前删除任何前导/尾随非数字。
我的 Java 不太流利,但我确信可能有一些更简洁的 Java 习惯用法可以使用您提供的代码来执行此操作。
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));
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(",")));
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。如果不是,则什么也不做。
添加回答
举报