SO面试题10:如何分割字符串?
# 问题
我有一个字符串 “004-034556”,我想把它拆分成如下两个字符串:
string1="004";
string2="034556";
换言之,就是第一个字符串将包含“-”之前的字符,第二个字符串将包含“-”之后的字符。我还想检查字符串中是否包含“-”。如果没有,我将抛出异常。将如何做呢?
# 最佳答案
其实可以用jdk自带的现成方法来实现:String#split()
代码如下:
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String 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]; // 004
String 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]; // 004
String part2 = parts[1]; // 034556-42
今天的这道题,还是讲解String类,不知道你get到没有?
stackoverflow原文:http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java
往期推荐
🔗
点击阅读原文,获得更多精彩内容