4 回答

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
您獲得前導(dǎo)空字符串的原因是因?yàn)槟亩ń绶ㄒ幌盗蟹菙?shù)字字符)引導(dǎo)字符串。這與以下原因相同:
String s = ","; String[] splitResult = s.split(",");
愿意splitResult
成為["",""]
。每有一個(gè)分隔符,即使它在字符串的開(kāi)頭或結(jié)尾,也是在分割字符串中的兩個(gè)標(biāo)記。如果定界符位于字符串的開(kāi)頭、字符串的末尾,或者如果有兩個(gè)相鄰的定界符(由于貪婪量詞,在您的情況下不會(huì)發(fā)生這種情況,但在上述情況下會(huì)發(fā)生+
)String s = ",,";
,那么拆分結(jié)果將有空字符串。
解決問(wèn)題的一種簡(jiǎn)單方法是過(guò)濾掉空字符串。您知道它只能出現(xiàn)在輸入字符串的前面或后面,所以這不是真正的問(wèn)題。例如:
檢查中的第一個(gè)和最后一個(gè)字符串
nums
。如果它們是空的,請(qǐng)刪除它們。使用正則表達(dá)式搜索數(shù)字,而不是按非數(shù)字拆分。
在運(yùn)行代碼之前刪除任何前導(dǎo)/尾隨非數(shù)字。
我的 Java 不太流利,但我確信可能有一些更簡(jiǎn)潔的 Java 習(xí)慣用法可以使用您提供的代碼來(lái)執(zhí)行此操作。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
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貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
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貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
為此,我會(huì)檢查 StringUtils 庫(kù): https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html
假設(shè)這是一個(gè)學(xué)校項(xiàng)目并且外部庫(kù)不是一個(gè)選項(xiàng),那么這段代碼應(yīng)該適合你:
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 將包含您的數(shù)字 ArrayList。
基本上,您所做的是在字符串的第一部分找到數(shù)字時(shí)將其拆分,然后遍歷該數(shù)組并使用正則表達(dá)式來(lái)確定數(shù)組的每個(gè)元素是否為數(shù)字。如果是,則將其添加到新的 realnums ArrayList。如果不是,則什么也不做。
添加回答
舉報(bào)