package com.norteksoft.product.web.struts2.query;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@SuppressWarnings({ "unchecked" })
public class StringUtil {
//中文格式,如:2000年01月01日
public static final int CN = 0;
//'/',如:2000/01/01
public static final int SLIP = 1;
//'.',如:2000.01.01
public static final int DOT = 2;
//'-',如:2000.01.01
public static final int DASH = 3;
public StringUtil() {
}
/**
* 去除一个字符串的'0'前缀
* @param sequ String
* @return String
*/
public static String trimPreZero(String sequ) {
String patternString = "0*";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(sequ);
return matcher.find() ? sequ.substring(matcher.end()) : ""; //后面的字符
}
/**
* 取sql语句从"from"之后的字符串
* @param sql String
* @return String
*/
public static String trimFrom(String sql) {
String patternString = "[Ff][Rr][Oo][Mm]";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(sql);
return matcher.find() ? sql.substring(matcher.start()) : ""; //后面的字符
}
public static int findStrPosition(String sql, String targetStr) {
String patternString = str2RegexStr(targetStr);
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(sql);
return matcher.find() ? matcher.start() : -1;
}
public static boolean findSelectSpaceDistinct(String sql) {
StringBuffer patternString = new StringBuffer();
patternString.append("\\s*").append(str2RegexStr("select"))
.append("\\s*").append("distinct");
Pattern pattern = Pattern.compile(patternString.toString());
Matcher matcher = pattern.matcher(sql);
return matcher.find() && matcher.start() == 0 ? true : false;
}
public static String findObjName(String sql) {
// 8 is the length of 'distinct'
return sql.substring(findStrPosition(sql, "distinct") + 8,
findStrPosition(sql, "from")).trim();
}
/**
* 根据字符串FROM
* 形成形如[Ff][Rr][Oo][Mm]的正则表达式
* @param str String
* @return String
*/
public static String str2RegexStr(String str) {
String upperCaseStr = str.toUpperCase();
char[] strArr = upperCaseStr.toCharArray();
char[] regexArr = new char[str.length() * 4];
for (int i = 0; i < strArr.length; i++) {
regexArr[4 * i] = '[';
regexArr[4 * i + 1] = strArr[i];
regexArr[4 * i + 2] = (char) (strArr[i] + 32); // to lower case
regexArr[4 * i + 3] = ']';
}
return String.copyValueOf(regexArr);
}
/**
* 取一个字符序列的下一个
* @param sequ String
* @return String
*/
public static String getNextSequ(String sequ) {
StringBuffer nextSequ = new StringBuffer();
int fullLen = sequ.length();
String postStr = trimPreZero(sequ);
if (!"".equals(postStr)) {
if (isInteger(postStr)) {
long postVal = Long.parseLong(postStr);
int newLen = String.valueOf(++postVal).length();
nextSequ = addPostZero(nextSequ, fullLen - newLen);
nextSequ.append(String.valueOf(postVal));
}
else {
return sequ;
}
}
else {
nextSequ = addPostZero(nextSequ, fullLen - 1);
nextSequ.append(String.valueOf(1));
}
return nextSequ.toString();
}
/**
* 为字符串设置前置'0'
* @param strBuf StringBuffer
* @param num int
* @return StringBuffer
*/
public static StringBuffer addPostZero(StringBuffer strBuf, int num) {
for (int i = 0; i < num; i++) {
strBuf.append("0");
}
return strBuf;
}
/**
* 判断一个字符串是否为整数
* @param str String
* @return boolean
*/
public static boolean isInteger(String str) {
try {
Long.parseLong(str);
}
catch (NumberFormatException ex) {
return false;
}
return true;
}
/**
* 测试用
* @param test int[]
* @return String
*/
public static String test(int[] test) {
int temp = 1;
for (int i = test.length - 1; i >= 0 && temp == 1; i--) {
if (test[i] + 1 > 9) {
test[i] = (test[i] + 1) % 10;
temp = 1;
}
else {
test[i]++;
temp = 0;
}
}
return null;
}
/**
* 取一个字符串的下一个序号
* 如果新字符串超过长度,则取字符串长度加1
* @param str String
* @return String
*/
public static String nextSequence(String str) {
char[] tempChar = str.trim().toCharArray();
int i = tempChar.length;
int carry = 1; //是否有进位的标志
while (--i >= 0) {
int temp = tempChar[i] - 47; //47 = 48 - 1(carry)意思:先将字符转为数字,然后加1
if (temp > 9) {
tempChar[i] = (char) (temp % 10 + 48); //需要进位,继续
}
else {
tempChar[i]++; //不需要进位,自增1,结束
carry = 0;
break;
}
}
String nextSequence = String.copyValueOf(tempChar);
//判断字符串是否超过长度
return i == -1 && carry == 1 ? "1" + nextSequence : nextSequence;
}
/**
* 取一个字符串的下一个序号
* @param str String
* @return String
*/
public static String nextSequence2(String str) {
char[] tempChar = str.trim().toCharArray();
int over = 1; //是否超过长度的标志
for (int i = tempChar.length - 1; i >= 0; i--) {
int temp = tempChar[i] - 47; //47 = 48 - 1(carry)意思:先将字符转为数字,然后加1
if (temp > 9) {
tempChar[i] = (char) (temp % 10 + 48); //需要进位,继续
over = i - 1;
}
else {
tempChar[i]++; //不需要进位,自增1,结束
break;
}
}
String nextSequence = String.copyValueOf(tempChar);
//判断字符串是否超过长度
return over == -1 ? "1" + nextSequence : nextSequence;
}
/**
* 中文格式,如:2000年01月01日
* @param str String
* @return String
*/
public static String cn2Date(String str) {
char[] tempStr = str.toCharArray();
for (int i = 0; i < tempStr.length; i++) {
switch (tempStr[i]) {
case '年':
case '月':
tempStr[i] = '-';
break;
case '日':
tempStr[i] = ' ';
break;
}
}
return String.valueOf(tempStr).trim();
}
/**
* 格式,如:2000/01/01
* @param str String
* @return String
*/
public static String slip2Date(String str) {
return str.replace('/', '-');
}
/**
* 格式,如:2000.01.01
* @param str String
* @return String
*/
public static String dot2Date(String str) {
return str.replace('.', '-');
}
/**
* 转换日期为需要的格式
* @param str String
* @param flag int
* @return String
*/
public static String formatDate(String str, int flag) {
String format = "";
if (str != null && !str.equals("")) {
switch (flag) {
case 0:
format = cn2Date(str);
break;
case 1:
format = slip2Date(str);
break;
case 2:
format = dot2Date(str);
break;
}
}
return format;
}
/**
* 日期以2000年01月01日格式显示
* @param str String
* @return String
*/
public static String date2Cn(String str) {
if (str != null && !str.equals("")) {
char[] tempStr = str.toCharArray();
tempStr[4] = '年';
tempStr[7] = '月';
return String.valueOf(tempStr).concat("日");
}
else {
return str;
}
}
/**
* 显示日期的格式
* @param str String
* @param flag int
* @return String
*/
public static String formatDateShow(String str, int flag) {
if (str != null && !str.equals("")) {
String formatDate = str;
switch (flag) {
case 0:
char[] tempStr = str.toCharArray();
tempStr[4] = '年';
tempStr[7] = '月';
formatDate = String.valueOf(tempStr).concat("日");
break;
case 1:
formatDate = str.replace('-', '/');
break;
case 2:
formatDate = str.replace('-', '.');
break;
}
return formatDate;
}
else {
return str;
}
}
/**
*替换不规则的order by 子句为" ORDER BY "
* @param sql String
* @return String
*/
public static String replaceOrderBy(String sql) {
String patternString = "\\s*[Oo][Rr][Dd][Ee][Rr]\\s+[Bb][Yy]\\s*";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(sql);
String wantStr = matcher.replaceAll(" ORDER BY "); //后面的字符
return wantStr;
}
/**
* 过滤 sql语句中的order by 子句
* 注意:order by 子句以及order by 字段不能含有()
* @param sequ String
* @return String
*/
public static String removeOrderBy(String sequ) {
String patternString = "\\sORDER\\sBY\\s[a-zA-Z0-9\\.\\_\\,\\s]+";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(replaceOrderBy(sequ));
String wantStr = matcher.replaceAll("");
return wantStr;
}
/**
* 形成查询语句的in()子句
* @param strArr String[]
* @return String
*/
public static String formInStr(String[] strArr) {
StringBuffer sbf = new StringBuffer();
if (strArr != null && strArr.length > 0) {
sbf.append("'").append(strArr[0]).append("'");
for (int i = 1; i < strArr.length; i++) {
sbf.append(",").append("'").append(strArr[i]).append("'");
}
}
return sbf.toString();
}
/**
* 形成in条件语句
* @param irt Iterator
* @param add boolean
* @return String
*/
private static String inConditionHelp(Iterator irt, boolean add) {
StringBuffer sb = new StringBuffer();
while (irt.hasNext()) {
sb.append(addQuotation(irt.next().toString(), add)).append(",");
}
return sb.toString().length() > 0 ?
sb.toString().substring(0, sb.toString().length() - 1) : sb.toString();
}
/**
* 形成in的预处理查询条件
* @param irt Iterator
* @return String
*/
private static String inPreparedHelp(Iterator irt) {
StringBuffer sb = new StringBuffer();
while (irt.hasNext()) {
irt.next();
sb.append("?").append(",");
}
return sb.toString().length() > 0 ?
sb.toString().substring(0, sb.toString().length() - 1) : sb.toString();
}
/**
* 形成查询语句的in()子句
* @param collection Object
* @param add boolean
* @return String
*/
public static String formInPrepared(Object collection) {
StringBuffer sb = new StringBuffer();
Iterator irt = null;
if (collection instanceof String) {
sb.append("?");
}
else {
irt = QueryUtil.obj2Iterator(collection);
sb.append(inPreparedHelp(irt));
}
return sb.toString();
}
/**
* 形成查询语句的in()子句
* @param collection Object
* @param add boolean
* @return String
*/
public static String formInCondition(Object collection, boolean add) {
StringBuffer sb = new StringBuffer();
Iterator irt = null;
if (collection instanceof String) {
sb.append(addQuotation( (String) collection, add));
}
else {
irt = QueryUtil.obj2Iterator(collection);
sb.append(inConditionHelp(irt, add));
}
return sb.toString();
}
/**
* 增加单引号
* @param str String
* @param add boolean
* @return String
*/
private static String addQuotation(String str, boolean add) {
StringBuffer sb = new StringBuffer();
if (str != null) {
if (add) {
sb.append("'").append(str).append("'");
}
else {
sb.append(str);
}
}
else {
return null;
}
return sb.toString();
}
/**
* 查找一个字符串中是否存在指定的字符
* @param str String
* @param targetStr String
* @param noCase boolean
* @return boolean true 区分大小写,false 不区分大小写
*/
public static boolean findString(String str, String targetStr, boolean noCase) {
String temp = str;
String targetTemp = targetStr;
if (noCase) {
temp = str.toLowerCase();
targetTemp = targetStr.toLowerCase();
}
Pattern pattern = Pattern.compile(targetTemp);
Matcher matcher = pattern.matcher(temp);
if (matcher.find()) {
return true;
}
else {
return false;
}
}
/**
* 设置路径
* @param url String
* @return String
*/
public static String changeUrl(String url) {
for (int i = 0; i < url.length(); i++) {
if (url.charAt(i) == '\\') {
url = url.replace('\\', '/');
}
}
return url;
}
/**
* 查找子字符串
* @param mother String
* @param son String
* @return boolean
*/
public static boolean findFixStr(String mother, String son) {
boolean find = false;
if (mother != null && son != null &&
!"".equals(mother) && !"".equals(son)) {
int pos = mother.indexOf(son);
if (pos >= 0) {
find = true;
}
}
return find;
}
/**
* 查找字符
* @param target String
* @param ch char
* @return boolean
*/
public static boolean strHasChar(String target, char ch) {
char[] target_char = target.toCharArray();
for (int i = 0; i < target_char.length; i++) {
if (ch == target_char[i]) {
return true;
}
}
return false;
}
/**
* 替换给定一个位置的字符
* @param target String
* @param ch char
* @param position int
* @return String
*/
public static String replaceCharWithPosition(String target, char ch,
int position) {
char[] target_char = target.toCharArray();
target_char[position] = ch;
return String.valueOf(target_char);
}
/**
* 用字符串with替换字符串replace
* @param target String
* @param replace String
* @param with String
* @return String
*/
public static String repalceString(String target, String replace, String with) {
StringBuffer sbf = new StringBuffer();
sbf.append(with).append(target.substring(replace.length()));
return sbf.toString();
}
/**
* 对 sql server 的 SQL语句拆分
* @param sql String
* @return int
*/
public static int getAfterSelectInsertPoint(String sql) {
int selectIndex = sql.toLowerCase().indexOf("select");
final int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct");
return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6);
}
/**
* 对 sql server 的 SQL语句增加 top 信息,
* 用以实现分页
* @param querySelect String
* @param limit int
* @return String
*/
public static String getLimitString(String querySelect, int limit) {
return new StringBuffer(querySelect.length() + 8)
.append(querySelect)
.insert(getAfterSelectInsertPoint(querySelect), " top " + limit).
toString();
}
/**
* 分解特定的字符串
* 形如:12.12.12.12, 1234.12434,
* 121212.12.12.12.12.1.2.12121.212121
* @param digitString String
* @return String[]
*/
public static String[] splitDigitString(String digitString) {
ArrayList stringList = new ArrayList();
String patternString = "\\d+([\\.]\\d+)+";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(digitString);
while (matcher.find()) {
stringList.add(matcher.group());
}
String[] temp = new String[stringList.size()];
System.arraycopy(stringList.toArray(), 0, temp, 0, stringList.size());
return temp;
}
/**
* 删除百分数的百分号
* @param str String
* @return String
*/
public static String removePercent(String str) {
if (str != null && !"".equals(str) &&
str.indexOf("%") > 0) {
return str.substring(0, str.indexOf("%"));
}
return str;
}
/**
* 对数字增加前缀0,以达到指定的长度
* @param num int
* @param len int
* @return String
*/
public static String addPreZero(int num, int len) {
String temp = String.valueOf(num);
StringBuffer sb = new StringBuffer();
if (temp.length() < len) {
for (int i = 0; i < len - temp.length(); i++) {
sb.append("0");
}
}
return sb.append(temp).toString();
}
/**
* 这个方法引用自org.apache.struts.util.ResponseUtils
* Filter the specified string for characters that are sensitive to
* HTML interpreters, returning the string with these characters replaced
* by the corresponding character entities.
* @param value String
* @return String
*/
public static String filter(String value) {
if (value == null || value.length() == 0) {
return value;
}
StringBuffer result = null;
String filtered = null;
for (int i = 0; i < value.length(); i++) {
filtered = null;
switch (value.charAt(i)) {
case '\n':
filtered = " ";
break;
case '\r':
filtered = " ";
break;
case '\t':
filtered = " ";
break;
case '\'':
filtered = " ";
break;
}
if (result == null) {
if (filtered != null) {
result = new StringBuffer(value.length() + 50);
if (i > 0) {
result.append(value.substring(0, i));
}
result.append(filtered);
}
}
else {
if (filtered == null) {
result.append(value.charAt(i));
}
else {
result.append(filtered);
}
}
}
return result == null ? value : result.toString();
}
/**
* 取需要的序列号(复杂)
* @param list List
* @return List
*/
public static List arrangeSequence(List list) {
if (list == null || list.size() == 0) { //没有任何数据
return list;
}
else {
int count = 0; //total count
List result = new ArrayList();
StringBuffer str = new StringBuffer("0"); //保存ID的序列号
String orderTrigger = "-1"; //序号标记
String preTime = null;
for (Iterator it = list.iterator(); it.hasNext(); ) {
count++;
HashMap theMap = (HashMap) it.next();
String id = (String) theMap.get("id");
String order = (String) theMap.get("order");
if (!orderTrigger.equals("-1") && !orderTrigger.equals(order) ||
list.size() == count) {
if (list.size() == count) {
if (orderTrigger.equals(order)) {
str.append(",").append(id);
}
else {
if (orderTrigger.equals("-1")) {
str.append(",").append(id);
}
HashMap resultMap = new HashMap();
resultMap.put("IDs", str.toString());
if (orderTrigger.equals("-1")) {
resultMap.put("inputTime", (String) theMap.get("time"));
}
else {
resultMap.put("inputTime", preTime);
}
result.add(resultMap);
str = new StringBuffer("0");
}
if (!orderTrigger.equals("-1") && !orderTrigger.equals(order)) {
str.append(",").append(id); //
}
}
if (!orderTrigger.equals("-1")) {
HashMap resultMap = new HashMap();
resultMap.put("IDs", str.toString());
if (list.size() == count) {
resultMap.put("inputTime", (String) theMap.get("time"));
}
else {
resultMap.put("inputTime", preTime);
}
result.add(resultMap);
str = new StringBuffer("0");
}
}
orderTrigger = order;
preTime = (String) theMap.get("time");
str.append(",").append(id);
}
return result;
}
}
/**
* 取字符串序列(简单)
* @param list List
* @return List
*/
public static List fetchSequence(List list) {
if (list == null || list.size() == 0) {
return list;
}
else {
List result = new ArrayList();
String preOrder = "-1";
for (Iterator it = list.iterator(); it.hasNext(); ) {
HashMap theMap = (HashMap) it.next();
if (!preOrder.equals( (String) theMap.get("order"))) {
result.add( (String) theMap.get("time"));
preOrder = (String) theMap.get("order");
}
}
return result;
}
}
}