需求:
需求:查找出以begin开头以end结尾的字符串
参数:
String str:目标字符串
String begin:子串开始条件
String end:子串结束条件
返回值类型: String[] 这里是引用
解决方案:
public String[] getSubStr(String s, String begin, String end){
List<String> strList = new ArrayList<>();
if (!isContain(s,begin,end)){//不满足取串条件返回空
return new String[]{};
}
do {
int b = s.indexOf(begin);//获取s中第一个begin索引位置
int e = s.indexOf(end);//获取s中第一个end的索引位置
if (b<e) {//b<e时取串
strList.add(s.substring(b+1, e));
}
s = s.substring(e + 1);//从end的下一个索引位置开始取剩余子串
}while (isContain(s,begin,end));//满足条件时再次取串
return strList.toArray(new String[strList.size()]);//将ArrayList转为字符串数组
}
//取子串条件:字符串s不为空且同时包含begin和end
public boolean isContain(String s, String begin, String end){
if (s!=null&&!"".equals(s)&&s.contains(begin)&&s.contains(end)) {
return true;
}
return false;
}
测试:
@Test
public void testDemo (){
String str = "[1000]01]s[a[g[kkkk]ja]][aaa][ig]we[hello]";
String begin = "[";
String end = "]";
String[] subStr = getSubStr(str, begin, end);
System.out.println(Arrays.toString(subStr));
//运行结果:[1000, a[g[kkkk, aaa, ig, hello]
}
分析:
(1)我写的这个方法从左往右识别起止字符,未考虑嵌套情况,故不重复取子串。
(2)若嵌套情况也需取出,我做了如下改变:
if (b<e) {//b<e时取串
strList.add(s.substring(b+1, e));
s = s.substring(b + 1);//从begin的下一个索引位置开始找剩余子串
}else{//若b>e,//从begin的索引位置开始找剩余子串
s = s.substring(b);
}
//运行结果:[1000, a[g[kkkk, g[kkkk, kkkk, aaa, ig, hello]
(3)若需求是从两端或从中间开始找成对的起止条件并进行取串,这个方法就无能为力了
(4)虽然需求简单,但要考虑到各种情况,并进行处理。