Java中split的用法及一个金典入坑题目
split() 方法根据匹配给定的正则表达式来拆分字符串。
注意: . 、 $、 | 和 * 等转义字符,必须得加 \\。
注意:多个分隔符,可以用 | 作为连字符。
语法
public String[] split(String regex, int limit)
参数
-
regex -- 正则表达式分隔符。
-
limit -- 分割的份数。
返回值
字符串数组。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class Test { public static void main(String args[]) { String str = new String( "Welcome-to-Runoob" ); System. out .println( "- 分隔符返回值 :" ); for (String retval: str.split( "-" )){ System. out .println(retval); } System. out .println( "" ); System. out .println( "- 分隔符设置分割份数返回值 :" ); for (String retval: str.split( "-" , 2)){ System. out .println(retval); } System. out .println( "" ); String str2 = new String( "www.runoob.com" ); System. out .println( "转义字符返回值 :" ); for (String retval: str2.split( "\\." , 3)){ System. out .println(retval); } System. out .println( "" ); String str3 = new String( "acount=? and uu =? or n=?" ); System. out .println( "多个分隔符返回值 :" ); for (String retval: str3.split( "and|or" )){ System. out .println(retval); } } } |
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | - 分隔符返回值 : Welcome to Runoob - 分隔符设置分割份数返回值 : Welcome to-Runoob 转义字符返回值 : www runoob com 多个分隔符返回值 : acount=? uu =? n=? |
入坑例题
LeetCode 151. 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
入坑:部分成功代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public String reverseWords(String s) { if (s.length() == 0) { return "" ; } String[] arr = s.split( " " ); StringBuffer bf = new StringBuffer(); for ( int i = arr.length - 1; i >= 0; i--) { bf.append(arr[i]); bf.append( " " ); } return bf.toString().trim(); } |
分析:上述代码使用按空格分割将字符串s分成字符形数组arr,然后再倒序遍历arr,并将遍历的结果存在bf中,最后将bf转成字符串,然后去除头尾的空格,得到结果,但是,
当使用:String[] arr = s.split(" ");时,对于下面这种情形则会出问题:
1 | s = " Bob Loves Alice " ; |
根本原因就是当按照空格划分,出现几个连续的空格时,结果可能并不是我们想要的,看下面的代码或许你就明白了
1 2 3 4 5 6 7 | public static void main(String[] args) { String s1= "zhang san li si wang" ; String[]a1=s1.split( " " ); String[]a2=s1.split( "\\s+" ); System. out .println(Arrays.toString(a1)+ " --- a1.len: " +a1.length); System. out .println(Arrays.toString(a2)+ " --- a2.len: " +a2.length); } |
思考一下,a1和a2这两个数组是一样长的吗?
看结果:
1 2 3 4 | [zhang, san, , li, , , si, , , , wang] --- a1.len: 11 [zhang, san, li, si, wang] --- a2.len: 5 Process finished with exit code 0 |
其实我们希望a1的结果是a2那样,但是其实并不是,实际上a1的长度是11
因此对于按空格划分字符串时,使用“\\s+”或许效果更好(表示至少匹配1个或多个空格)
1 | // 为什么是\\s,因为java中\表示是转义字符,例如想输出括号需要输出 \( 而不是( 因此java中用\\s |
本文来自博客园,作者:{Justin_Hu},转载请注明原文链接:{https://www.cnblogs.com/gchenghu/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?