今天碰到一道输入格式题,大佬们都在用split,只有我在一点点模拟,羞愧羞愧,在这里把split函数边学习边整理一下,ORZ。
首先,split函数分为两种:
一是:split(regex),参数为要分隔的字符串或者正则表达式。
二是:ss.split(regex, limit)。此方法可以的第二个参数一般不太常用,但是这里依旧给出第二个参数代表的具体含义: limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
以上两个函数的返回值均为String[].
(注意:一下所有代码,均是使用第一种方法)
总结split的四种常用的使用方法:
一、普遍方法;
给出样例代码:
package a;
public class a {
public static void main(String[] args) {
String s="我,是,一,个,教,师";
String[] t=s.split(",");
for(int i=0;i<t.length;i++)
{
System.out.print(t[i]);
}
}
}
//样例输出:我是一个教师
在这里可以看出split函数的基本用法,就是以括号里的特定表达式进行对字符串的分割,并将分割的每一个子串储存在String[]数组中。
二、转义字符的分割;
有一类特定的字符,在进行split的分割中需要在字符之间加"\\"或者是"[]",来对其进行转义。
这些字符有| , + , * , ^ , $ , / , | , [ , ] , ( , ) , - , . , \(咳咳,里面的逗号不是哈)等, 因它们是正则表达式中的一部分, 所以如果想用该字符本身, 这些字符需要进行转义才能表示它本身;
下面给出样例代码:
package a;
public class a {
public static void main(String[] args) {
String s="我*是*一*个*教*师";
// String[] t=s.split("*");
//
// for(int i=0;i<t.length;i++)
// {
// System.out.println(t[i]);
// }
//方法出错,无法得到想要的结果,并且编译报错
String[] t=s.split("\\*");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}//正确方法
String[] t=s.split("[*]");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}//正确方法
}
}
转义字符必须经过转义之后才能进行分割!!!
三、同种多个分割符的分割
为了方便理解这里先给出一些样例,方便理解
package a;
public class a {
public static void main(String[] args) {
String s="***我*****是****一****个*****教******师******";
String[] t=s.split("[*]");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}
}
}
//样例输出
//我
//
//
//
//
//是
//
//
//
//一
//
//
//
//个
//
//
//
//
//教
//
//
//
//
//
//师
从样例可以看出,当有多个分隔符连接在一起时,split函数只会忽略掉第一个分隔符(开头一个也不忽略,直接全部变为null存在字符串数组t中),而其他的全部当做空字符串处理,对应输出中的空行。
下面给出解决方法;
package ceshi;
public class Main {
public static void main(String[] args)
{
String s="******我******是*****个****教****师";
String[] t=s.split("\\*+");
System.out.println("输出测案例 --------");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}
}
}
//样例输出
//输出测案例 --------
//
//我
//是
//个
//教
//师
其中的‘+’表示多次匹配的意思,所以就可以消除中间许多匹配符号的问题,但是注意开头的空行,这个是无法避免,但具体我也不是很清楚,希望懂得可以指点一下。下面再给出一个案例加深理解。
package ceshi;
public class Main {
public static void main(String[] args)
{
String s="a b c d";
String[] t=s.split("\\s+");
System.out.println("输出测案例 --------");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}
}
}
//输出测案例 --------
//a
//b
//c
//d
其中\s代表的是空格符,这个代码可用于筛选其中字符串的空格个(再次注意,如果开头有分隔符,第一行输出的是空行也就相当于null)。
四、多种分割符的分割
在很多种情况下,一种分割符是无法满足我们的要求的,这就要求我们一次根据多种分隔符进行分割。
下面给出样例代码:
package ceshi;
public class Main {
public static void main(String[] args)
{
String s="1+2-2*2%4+6/5=3";
String[] t=s.split("[+,0,*,%,/,=,-]");
System.out.println("输出测案例 --------");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}
}
}
//输出测案例 --------
//1
//2
//2
//2
//4
//6
//5
//3
在进行多种符号分割时需要用到[]符号或者 | 分隔“|”分隔实例,这篇博客详细介绍了‘|’在这里不多提。【】本身相当于转义,所以当【】中含有转义字符时不需要再加 \ 进行转义,这也是他的方便之处。
如果需要进行多次匹配的话在【】外加‘+‘即可。下面同样给出例子。
package ceshi;
public class Main {
public static void main(String[] args)
{
String s="1+++++2-2*2%4+6/5=3";
String[] t=s.split("[+,0,*,%,/,=,-]+");
System.out.println("输出测案例 --------");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}
}
}
//输出测案例 --------
//1
//2
//2
//2
//4
//6
//5
//3
package ceshi;
public class Main {
public static void main(String[] args)
{
String s="abccccccdr fdacccccsfdgsa";
String[] t=s.split("[\\s,c]+");
System.out.println("输出测案例 --------");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}
}
}
//输出测案例 --------
//ab
//dr
//fda
//sfdgsa
五、特殊情况
本来写到这里想结束这篇博客的,但是突然在网上看到一种很有意思的情况,在这里给大家分享一下,注意以上四种中也不是非常全面,更多的需要自己大胆去写去揣摩。
下面给出样例代码以及其注释:
package ceshi;
public class Main {
public static void main(String[] args)
{
String s="abccccccdd\\gsa";
String[] t=s.split("\\\\");
System.out.println("输出测案例 --------");
for(int i=0;i<t.length;i++)
{
System.out.println(t[i]);
}
}
}
//输出测案例 --------
//abccccccdd
//gsa
以后如果还有新的发现,会继续更新,也希望有干货的大佬,可以多多分享指点,