写在前面:
用split函数处理正则表达式时用到了Pattern类和Matcher类,Pattern类和Matcher类用法详解可参考大神的博客:https://blog.csdn.net/zengxiantao1994/article/details/77803960.
spilt函数:
主要有三种情况:
1.只有一位普通字符;
2.两位转义字符;
3.正则表达式。
SplitUtil类
package num;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SplitUtil {
private static final String contant = ".$|()[{^?*+\\";
public static String[] splitMethod(String string, String regex){
char ch = 0;
int off = 0;
int next = 0;
ArrayList<String> list = new ArrayList();
//一位字符或是转义字符
if(regex.length() == 1 && contant.indexOf(ch = regex.charAt(0)) == -1 ||
regex.length() ==2 && regex.charAt(0)=='\\' && ((ch = regex.charAt(1))-'0'|'9'-ch)<0 && (ch-'a' | 'z'-ch)<0 && (ch-'A'|'Z' -ch)<0)
{
while ((next = string.indexOf(ch,off)) > 0){
list.add(string.substring(off, next));
off = next + 1;
}
if(off == 0){
return new String[]{string};
}
list.add(string.substring(off, string.length()));
return interceptEmpty(list);
}
//正则表达式
return regexSplit(string, regex);
}
//正则表达式
private static String[] regexSplit(String string, String regex) {
int off = 0;
//将给定的正则表达式编译到模式中
Pattern pattern = Pattern.compile(regex);
//创建给定输入与此模式匹配的匹配器
Matcher m = pattern.matcher(string);
List<String> list = new ArrayList();
while (m.find()){
//m.start(): 返回第一个匹配字符的索引
list.add(string.substring(off, m.start()));
//System.out.println(off+" "+m.start()+" "+m.end());
list.add(string.substring(m.start(), m.end()));
//m.end(): 返回最后匹配字符之后的偏移量
off = m.end();
}
if(off == 0){
return new String[]{string};
}
list.add(string.substring(off, string.length()));
return interceptEmpty(list);
}
//截取空字符串
private static String[] interceptEmpty(List<String> list){
int resultSize = list.size();
while (resultSize>0 && list.get(resultSize-1).length() == 0){
resultSize--;
}
String[] strings = new String[resultSize];
return list.subList(0, resultSize).toArray(strings);
}
//测试方法
/*public void test() {
//测试regex只有一位,且不为列出的特殊字符
String s1 = "gg,tge,hbfs,ijkd,,,";
String[] strings1 = splitMethod(s1, ",");
for (int i = 0; i < strings1.length; i++) {
System.out.println(strings1[i]);
}
//测试regex有两位,第一位位转义字符且第二位不是数字和字母
String s2 = "bb\'dn\'ags\'kl\'\'";
String[] strings2 = splitMethod(s2,"\\'");
for (int i = 0; i < strings2.length; i++) {
System.out.println(strings2[i]);
}
//测试正则表达式
String ss = "ac32dge533grhr139ljs343";
String[] strings = splitMethod(ss,"[\\d]+");
for (int i = 0; i < strings.length; i++) {
System.out.println(strings[i]);
}
}*/
}
害,需要注意处理正则表达式的这里:
//正则表达式
private static String[] regexSplit(String string, String regex) {
int off = 0;
//将给定的正则表达式编译到模式中
Pattern pattern = Pattern.compile(regex);
//创建给定输入与此模式匹配的匹配器
Matcher m = pattern.matcher(string);
List<String> list = new ArrayList();
while (m.find()){
//m.start(): 返回第一个匹配字符的索引
list.add(string.substring(off, m.start()));
//System.out.println(off+" "+m.start()+" "+m.end());
list.add(string.substring(m.start(), m.end()));
//m.end(): 返回最后匹配字符之后的偏移量
off = m.end();
}
if(off == 0){
return new String[]{string};
}
list.add(string.substring(off, string.length()));
return interceptEmpty(list);
}
list.add(string.substring(m.start(), m.end()));
这一句是截取了分隔符部分,spilt方法不会存储分隔符。但是老师要求输出分隔符 只处理了正则表达式这里的输出,前两种情况不输出分隔符。
splitmain类:
package num;
public class splitmain {
public static void main(String[] args) {
// TODO Auto-generated method stub
SplitUtil xx = new SplitUtil();
String[] strings = xx.splitMethod("asb#?Gfj%123*hj", "[#?%*]");
for (int i = 0; i < strings.length; i++) {
System.out.println(strings[i]);
}
}
}
预览输出如下:
中间为什么会多一个空格呢?因为“asb#?Gfj%123*hj”中,分隔符“#”与“?”之间为null,自然没有输出了。要去掉的话,在输出的时候判断一下是否为空。
写在后面:
意大利作家卡尔维诺说:
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。
我相信缓慢,平和,细说长流的力量,踏实,冷静。
我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。
而那些真正让人变好的选择,过程都不会很舒服,甚至痛苦。
比如锻炼身体,比如学习一门技能。唯有你内心足够渴望,你才有顽强的意志力去支撑、鼓舞着自己去坚持。并且把这种坚持变成生命中和喝水吃饭睡觉一样重要的事情。
静水深流,源源不断,终能汇成大江大河。而这,就是自律的顶级力量。