查看原文
其他

SO面试题10:如何分割字符串?

忆蓉之心 Java面试那些事儿 2020-10-08



# 问题


我有一个字符串 “004-034556”,我想把它拆分成如下两个字符串:

string1="004";string2="034556";

换言之,就是第一个字符串将包含“-”之前的字符,第二个字符串将包含“-”之后的字符。我还想检查字符串中是否包含“-”。如果没有,我将抛出异常。将如何做呢?


# 最佳答案


其实可以用jdk自带的现成方法来实现:String#split()

代码如下:

String string = "004-034556";String[] parts = string.split("-");String part1 = parts[0]; // 004String part2 = parts[1]; // 034556

通过api文档,我们可以发现传入的参数是一个正则表达式,必须要对特殊字符进行转义。


特殊字符为:\,^,$,点号,|,?,*,+,(,),[,{等,这些字符统称为元字符。
参考:http://www.regular-expressions.info/characters.html


比如你要拆分点号,就需要用转义字符来进行转义,例如:

split("\\.")

或者使用字符类[]表示文字字符,例如:

split("[.]")

或者使用 Pattern#quote() 转义整个字符串,例如:

String[] parts = string.split(Pattern.quote(".")); // Split on period.

要判断某字符串是否包含某字符,可以使用 String#contains(),例如:

if (string.contains("-")) { // Split it.} else { throw new IllegalArgumentException("String " + string + " does not contain -");}

我们通过api文档可以发现,它传入的参数不是正则表达式,只是一个字符串。


但是,String#matches()这个方法,出入的参数确实一个正则表达式,参照其javadoc文档。

如果要保留分隔符,可以使用Lookahead和Lookbehind。


要使分割字符以左结尾,请在模式前面加上 ?<=,例如:

String string = "004-034556";String[] parts = string.split("(?<=-)");String part1 = parts[0]; // 004-String part2 = parts[1]; // 034556

要使分割字符以右侧结尾,请在模式前面加上 ?=,例如:

String string = "004-034556";String[] parts = string.split("(?=-)");String part1 = parts[0]; // 004String part2 = parts[1]; // -034556

不知道,你注意到String#split()没有?

limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。


例如:

String string = "004-034556-42";String[] parts = string.split("-", 2);String part1 = parts[0]; // 004String part2 = parts[1]; // 034556-42

今天的这道题,还是讲解String类,不知道你get到没有?


stackoverflow原文:http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java



 往期推荐 

🔗



 

点击阅读原文,获得更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存