不抛出越界异常的求子串方法
用String.substring方法,不小心会有越界异常。现实现一个没抛出越界异常,越界就返回null,不过直接返回的再用其它方法,可能有Null异常。现还实现可以负index的,可能逆向的。
package
com.chenlb.util;
public class StringUtil {
/**
* start与end均可负数<br/>
* start < end正向取, start > end逆向取<br/>
* 示例:str="I am chenlb"<br/>
* StringUtil.substring(str, 0, 12) -> null<br/>
* StringUtil.substring(str, 12, 12) -> null<br/>
* StringUtil.substring(str, 12, 13) -> null<br/>
* StringUtil.substring(str, 4, 4) -> ""<br/>
* StringUtil.substring(str, 0, 4) -> "I am"<br/>
* StringUtil.substring(str, -4, -1) -> "enl"<br/>
* StringUtil.substring(str, -2, 4) -> "lbI am"<br/>
* StringUtil.substring(str, 4, 0) -> "ma I"<br/>
* StringUtil.substring(str, -1, -4) -> "lne"<br/>
* StringUtil.substring(str, 1, -4) -> "Iblne"<br/>
* StringUtil.substring(str, 0, -4) -> "blne"<br/>
* StringUtil.substring(str, -4, 0) -> "enlb"<br/>
* @return 越界返回null, start==end返回空
* @author chenlb 2008-6-18 下午12:39:51
*/
public static String substring(String str, int start, int end) {
if (str == null ) {
return null ;
}
int len = str.length();
if (Math.abs(start) >= len) {
return null ;
}
if (Math.abs(end) > len) {
return null ;
}
StringBuilder sb = new StringBuilder();
if (end > start) { // 正向
substring(sb, str, start, end);
} else if (end == start) {
return "" ;
} else { // 逆向 end < start
substring(sb, str, end, start);
sb.reverse();
}
return sb.toString();
}
private static void substring(StringBuilder sb, String str, int start, int end) {
int len = str.length();
if (start < 0 ) {
if (end < 0 ) {
sb.append(str.substring(len + start, len + end));
} else {
sb.append(str.substring(len + start, len));
sb.append(str.substring( 0 , end));
}
} else {
sb.append(str.substring(start, end));
}
}
}
public class StringUtil {
/**
* start与end均可负数<br/>
* start < end正向取, start > end逆向取<br/>
* 示例:str="I am chenlb"<br/>
* StringUtil.substring(str, 0, 12) -> null<br/>
* StringUtil.substring(str, 12, 12) -> null<br/>
* StringUtil.substring(str, 12, 13) -> null<br/>
* StringUtil.substring(str, 4, 4) -> ""<br/>
* StringUtil.substring(str, 0, 4) -> "I am"<br/>
* StringUtil.substring(str, -4, -1) -> "enl"<br/>
* StringUtil.substring(str, -2, 4) -> "lbI am"<br/>
* StringUtil.substring(str, 4, 0) -> "ma I"<br/>
* StringUtil.substring(str, -1, -4) -> "lne"<br/>
* StringUtil.substring(str, 1, -4) -> "Iblne"<br/>
* StringUtil.substring(str, 0, -4) -> "blne"<br/>
* StringUtil.substring(str, -4, 0) -> "enlb"<br/>
* @return 越界返回null, start==end返回空
* @author chenlb 2008-6-18 下午12:39:51
*/
public static String substring(String str, int start, int end) {
if (str == null ) {
return null ;
}
int len = str.length();
if (Math.abs(start) >= len) {
return null ;
}
if (Math.abs(end) > len) {
return null ;
}
StringBuilder sb = new StringBuilder();
if (end > start) { // 正向
substring(sb, str, start, end);
} else if (end == start) {
return "" ;
} else { // 逆向 end < start
substring(sb, str, end, start);
sb.reverse();
}
return sb.toString();
}
private static void substring(StringBuilder sb, String str, int start, int end) {
int len = str.length();
if (start < 0 ) {
if (end < 0 ) {
sb.append(str.substring(len + start, len + end));
} else {
sb.append(str.substring(len + start, len));
sb.append(str.substring( 0 , end));
}
} else {
sb.append(str.substring(start, end));
}
}
}
测试代码:
public
void
testSubstring() {
String str = " I am chenlb " ;
assertEquals( null , StringUtil.substring(str, 0 , 12 ));
assertEquals( null , StringUtil.substring(str, 12 , 12 ));
assertEquals( null , StringUtil.substring(str, 12 , 13 ));
assertEquals( "" , StringUtil.substring(str, 4 , 4 ));
assertEquals( " I am " , StringUtil.substring(str, 0 , 4 ));
assertEquals( " am " , StringUtil.substring(str, 2 , 4 ));
assertEquals( " I am chenlb " , StringUtil.substring(str, 0 , 11 ));
assertEquals( " enl " , StringUtil.substring(str, - 4 , - 1 ));
assertEquals( " lbI am " , StringUtil.substring(str, - 2 , 4 ));
assertEquals( " ma I " , StringUtil.substring(str, 4 , 0 ));
assertEquals( " lne " , StringUtil.substring(str, - 1 , - 4 ));
assertEquals( " Iblne " , StringUtil.substring(str, 1 , - 4 ));
assertEquals( " blne " , StringUtil.substring(str, 0 , - 4 ));
assertEquals( " enlb " , StringUtil.substring(str, - 4 , 0 ));
}
String str = " I am chenlb " ;
assertEquals( null , StringUtil.substring(str, 0 , 12 ));
assertEquals( null , StringUtil.substring(str, 12 , 12 ));
assertEquals( null , StringUtil.substring(str, 12 , 13 ));
assertEquals( "" , StringUtil.substring(str, 4 , 4 ));
assertEquals( " I am " , StringUtil.substring(str, 0 , 4 ));
assertEquals( " am " , StringUtil.substring(str, 2 , 4 ));
assertEquals( " I am chenlb " , StringUtil.substring(str, 0 , 11 ));
assertEquals( " enl " , StringUtil.substring(str, - 4 , - 1 ));
assertEquals( " lbI am " , StringUtil.substring(str, - 2 , 4 ));
assertEquals( " ma I " , StringUtil.substring(str, 4 , 0 ));
assertEquals( " lne " , StringUtil.substring(str, - 1 , - 4 ));
assertEquals( " Iblne " , StringUtil.substring(str, 1 , - 4 ));
assertEquals( " blne " , StringUtil.substring(str, 0 , - 4 ));
assertEquals( " enlb " , StringUtil.substring(str, - 4 , 0 ));
}