1. package org.jr.util;
  2. /**
  3. * Copyright: Copyright (c) 2002-2004
  4. * Company: JavaResearch(http://www.javaresearch.org)
  5. * 最后更新日期:2003年3月31日
  6. * @author Cherami
  7. */
  8. import java.io.*;
  9. import java.util.*;
  10. import java.text.*;
  11. /**
  12. * 此类中封装一些常用的字符串操作。
  13. * 所有方法都是静态方法,不需要生成此类的实例,
  14. * 为避免生成此类的实例,构造方法被申明为private类型的。
  15. * @since 0.1
  16. */
  17. public class StringUtil {
  18. /**
  19. * 私有构造方法,防止类的实例化,因为工具类不需要实例化。
  20. */
  21. private StringUtil() {
  22. }
  23. /**
  24. * 此方法将给出的字符串source使用delim划分为单词数组。
  25. * @param source 需要进行划分的原字符串
  26. * @param delim 单词的分隔字符串
  27. * @return 划分以后的数组,如果source为null的时候返回以source为唯一元素的数组,
  28. * 如果delim为null则使用逗号作为分隔字符串。
  29. * @since 0.1
  30. */
  31. public static String[] split(String source, String delim) {
  32. String[] wordLists;
  33. if (source == null) {
  34. wordLists = new String[1];
  35. wordLists[0] = source;
  36. return wordLists;
  37. }
  38. if (delim == null) {
  39. delim = ",";
  40. }
  41. StringTokenizer st = new StringTokenizer(source, delim);
  42. int total = st.countTokens();
  43. wordLists = new String[total];
  44. for (int i = 0; i < total; i++) {
  45. wordLists[i] = st.nextToken();
  46. }
  47. return wordLists;
  48. }
  49. /**
  50. * 此方法将给出的字符串source使用delim划分为单词数组。
  51. * @param source 需要进行划分的原字符串
  52. * @param delim 单词的分隔字符
  53. * @return 划分以后的数组,如果source为null的时候返回以source为唯一元素的数组。
  54. * @since 0.2
  55. */
  56. public static String[] split(String source, char delim) {
  57. return split(source, String.valueOf(delim));
  58. }
  59. /**
  60. * 此方法将给出的字符串source使用逗号划分为单词数组。
  61. * @param source 需要进行划分的原字符串
  62. * @return 划分以后的数组,如果source为null的时候返回以source为唯一元素的数组。
  63. * @since 0.1
  64. */
  65. public static String[] split(String source) {
  66. return split(source, ",");
  67. }
  68. /**
  69. * 循环打印字符串数组。
  70. * 字符串数组的各元素间以指定字符分隔,如果字符串中已经包含指定字符则在字符串的两端加上双引号。
  71. * @param strings 字符串数组
  72. * @param delim 分隔符
  73. * @param out 打印到的输出流
  74. * @since 0.4
  75. */
  76. public static void printStrings(String[] strings, String delim,
  77. OutputStream out) {
  78. try {
  79. if (strings != null) {
  80. int length = strings.length - 1;
  81. for (int i = 0; i < length; i++) {
  82. if (strings[i] != null) {
  83. if (strings[i].indexOf(delim) > -1) {
  84. out.write( ("\"" + strings[i] + "\"" + delim).getBytes());
  85. }
  86. else {
  87. out.write( (strings[i] + delim).getBytes());
  88. }
  89. }
  90. else {
  91. out.write("null".getBytes());
  92. }
  93. }
  94. if (strings[length] != null) {
  95. if (strings[length].indexOf(delim) > -1) {
  96. out.write( ("\"" + strings[length] + "\"").getBytes());
  97. }
  98. else {
  99. out.write(strings[length].getBytes());
  100. }
  101. }
  102. else {
  103. out.write("null".getBytes());
  104. }
  105. }
  106. else {
  107. out.write("null".getBytes());
  108. }
  109. out.write(Constants.LINE_SEPARATOR.getBytes());
  110. }
  111. catch (IOException e) {
  112. }
  113. }
  114. /**
  115. * 循环打印字符串数组到标准输出。
  116. * 字符串数组的各元素间以指定字符分隔,如果字符串中已经包含指定字符则在字符串的两端加上双引号。
  117. * @param strings 字符串数组
  118. * @param delim 分隔符
  119. * @since 0.4
  120. */
  121. public static void printStrings(String[] strings, String delim) {
  122. printStrings(strings, delim, System.out);
  123. }
  124. /**
  125. * 循环打印字符串数组。
  126. * 字符串数组的各元素间以逗号分隔,如果字符串中已经包含逗号则在字符串的两端加上双引号。
  127. * @param strings 字符串数组
  128. * @param out 打印到的输出流
  129. * @since 0.2
  130. */
  131. public static void printStrings(String[] strings, OutputStream out) {
  132. printStrings(strings, ",", out);
  133. }
  134. /**
  135. * 循环打印字符串数组到系统标准输出流System.out。
  136. * 字符串数组的各元素间以逗号分隔,如果字符串中已经包含逗号则在字符串的两端加上双引号。
  137. * @param strings 字符串数组
  138. * @since 0.2
  139. */
  140. public static void printStrings(String[] strings) {
  141. printStrings(strings, ",", System.out);
  142. }
  143. /**
  144. * 将字符串中的变量使用values数组中的内容进行替换。
  145. * 替换的过程是不进行嵌套的,即如果替换的内容中包含变量表达式时不会替换。
  146. * @param prefix 变量前缀字符串
  147. * @param source 带参数的原字符串
  148. * @param values 替换用的字符串数组
  149. * @return 替换后的字符串。
  150. * 如果前缀为null则使用“%”作为前缀;
  151. * 如果source或者values为null或者values的长度为0则返回source;
  152. * 如果values的长度大于参数的个数,多余的值将被忽略;
  153. * 如果values的长度小于参数的个数,则后面的所有参数都使用最后一个值进行替换。
  154. * @since 0.2
  155. */
  156. public static String getReplaceString(String prefix, String source,
  157. String[] values) {
  158. String result = source;
  159. if (source == null || values == null || values.length < 1) {
  160. return source;
  161. }
  162. if (prefix == null) {
  163. prefix = "%";
  164. }
  165. for (int i = 0; i < values.length; i++) {
  166. String argument = prefix + Integer.toString(i + 1);
  167. int index = result.indexOf(argument);
  168. if (index != -1) {
  169. String temp = result.substring(0, index);
  170. if (i < values.length) {
  171. temp += values[i];
  172. }
  173. else {
  174. temp += values[values.length - 1];
  175. }
  176. temp += result.substring(index + 2);
  177. result = temp;
  178. }
  179. }
  180. return result;
  181. }
  182. /**
  183. * 将字符串中的变量(以“%”为前导后接数字)使用values数组中的内容进行替换。
  184. * 替换的过程是不进行嵌套的,即如果替换的内容中包含变量表达式时不会替换。
  185. * @param source 带参数的原字符串
  186. * @param values 替换用的字符串数组
  187. * @return 替换后的字符串
  188. * @since 0.1
  189. */
  190. public static String getReplaceString(String source, String[] values) {
  191. return getReplaceString("%", source, values);
  192. }
  193. /**
  194. * 字符串数组中是否包含指定的字符串。
  195. * @param strings 字符串数组
  196. * @param string 字符串
  197. * @param caseSensitive 是否大小写敏感
  198. * @return 包含时返回true,否则返回false
  199. * @since 0.4
  200. */
  201. public static boolean contains(String[] strings, String string,
  202. boolean caseSensitive) {
  203. for (int i = 0; i < strings.length; i++) {
  204. if (caseSensitive == true) {
  205. if (strings[i].equals(string)) {
  206. return true;
  207. }
  208. }
  209. else {
  210. if (strings[i].equalsIgnoreCase(string)) {
  211. return true;
  212. }
  213. }
  214. }
  215. return false;
  216. }
  217. /**
  218. * 字符串数组中是否包含指定的字符串。大小写敏感。
  219. * @param strings 字符串数组
  220. * @param string 字符串
  221. * @return 包含时返回true,否则返回false
  222. * @since 0.4
  223. */
  224. public static boolean contains(String[] strings, String string) {
  225. return contains(strings, string, true);
  226. }
  227. /**
  228. * 不区分大小写判定字符串数组中是否包含指定的字符串。
  229. * @param strings 字符串数组
  230. * @param string 字符串
  231. * @return 包含时返回true,否则返回false
  232. * @since 0.4
  233. */
  234. public static boolean containsIgnoreCase(String[] strings, String string) {
  235. return contains(strings, string, false);
  236. }
  237. /**
  238. * 将字符串数组使用指定的分隔符合并成一个字符串。
  239. * @param array 字符串数组
  240. * @param delim 分隔符,为null的时候使用""作为分隔符(即没有分隔符)
  241. * @return 合并后的字符串
  242. * @since 0.4
  243. */
  244. public static String combineStringArray(String[] array, String delim) {
  245. int length = array.length - 1;
  246. if (delim == null) {
  247. delim = "";
  248. }
  249. StringBuffer result = new StringBuffer(length * 8);
  250. for (int i = 0; i < length; i++) {
  251. result.append(array[i]);
  252. result.append(delim);
  253. }
  254. result.append(array[length]);
  255. return result.toString();
  256. }
  257. /**
  258. * 以指定的字符和长度生成一个该字符的指定长度的字符串。
  259. * @param c 指定的字符
  260. * @param length 指定的长度
  261. * @return 最终生成的字符串
  262. * @since 0.6
  263. */
  264. public static String fillString(char c,int length) {
  265. String ret = "";
  266. for (int i=0; i<length; i++) {ret += c;}
  267. return ret;
  268. }
  269. /**
  270. * 去除左边多余的空格。
  271. * @param value 待去左边空格的字符串
  272. * @return 去掉左边空格后的字符串
  273. * @since 0.6
  274. */
  275. public static String trimLeft(String value) {
  276. String result = value;
  277. if(result == null) return result;
  278. char ch[] = result.toCharArray();
  279. int index = -1;
  280. for(int i=0; i < ch.length ; i++) {
  281. if(Character.isWhitespace(ch[i])) {
  282. index = i;
  283. }
  284. else {
  285. break;
  286. }
  287. }
  288. if(index != -1) {
  289. result = result.substring(index+1);
  290. }
  291. return result;
  292. }
  293. /**
  294. * 去除右边多余的空格。
  295. * @param value 待去右边空格的字符串
  296. * @return 去掉右边空格后的字符串
  297. * @since 0.6
  298. */
  299. public static String trimRight(String value) {
  300. String result = value;
  301. if(result == null) return result;
  302. char ch[] = result.toCharArray();
  303. int endIndex = -1;
  304. for(int i=ch.length-1; i > -1; i--) {
  305. if(Character.isWhitespace(ch[i])) {
  306. endIndex = i;
  307. }
  308. else {
  309. break;
  310. }
  311. }
  312. if(endIndex != -1) {
  313. result = result.substring(0, endIndex);
  314. }
  315. return result;
  316. }
  317. /**
  318. * 根据转义列表对字符串进行转义。
  319. * @param source 待转义的字符串
  320. * @param escapeCharMap 转义列表
  321. * @return 转义后的字符串
  322. * @since 0.6
  323. */
  324. public static String escapeCharacter(String source, HashMap escapeCharMap) {
  325. if (source == null || source.length() == 0) return source;
  326. if (escapeCharMap.size() == 0) return source;
  327. StringBuffer sb = new StringBuffer();
  328. StringCharacterIterator sci = new StringCharacterIterator(source);
  329. for (char c = sci.first(); c != StringCharacterIterator.DONE; c = sci.next()) {
  330. String character = String.valueOf(c);
  331. if (escapeCharMap.containsKey(character))
  332. character = (String)escapeCharMap.get(character);
  333. sb.append(character);
  334. }
  335. return sb.toString();
  336. }
  337. /**
  338. * 得到字符串的字节长度。
  339. * @param source 字符串
  340. * @return 字符串的字节长度
  341. * @since 0.6
  342. */
  343. public static int getByteLength(String source){
  344. int len = 0;
  345. for(int i=0;i<source.length();i++){
  346. char c = source.charAt(i);
  347. int highByte = c >>> 8;
  348. len += highByte==0?1:2;
  349. }
  350. return len;
  351. }
  352. /**
  353. * 得到字符串中的子串的个数。
  354. * @param source 字符串
  355. * @param sub 子串
  356. * @return 字符串中的子串的个数
  357. * @since 0.6
  358. */
  359. public static int getSubtringCount(String source,String sub) {
  360. if (source == null || source.length() == 0) {
  361. return 0;
  362. }
  363. int count=0;
  364. int index=source.indexOf(sub);
  365. while (index>=0) {
  366. count++;
  367. index=source.indexOf(sub,index+1);
  368. }
  369. return count;
  370. }
  371. }