StringUtil.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937
  1. package cn.com.lzt.common.util;
  2. import org.apache.commons.lang.RandomStringUtils;
  3. import org.jsoup.Jsoup;
  4. import org.jsoup.safety.Whitelist;
  5. import java.io.File;
  6. import java.io.UnsupportedEncodingException;
  7. import java.math.BigDecimal;
  8. import java.text.SimpleDateFormat;
  9. import java.util.*;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;
  12. public class StringUtil {
  13. public static String _HREF_URL_REGEX = "(http:|https:)//[^[A-Za-z0-9\\._\\?%&+\\-=/#!]]*";
  14. public static final String EMPTY_STRING = "";
  15. private static char chars[] = "0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
  16. private static final char IntChars[] = "1234567890".toCharArray();
  17. public static String formatDate(String pattern, Date date) {
  18. SimpleDateFormat formator = new SimpleDateFormat();
  19. formator.applyPattern(pattern);
  20. return formator.format(date);
  21. }
  22. public static String getDateTime() {
  23. SimpleDateFormat ymdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  24. return ymdhms.format(new Date());
  25. }
  26. public static String getUUID(int length) {
  27. return RandomStringUtils.randomNumeric(length);
  28. }
  29. public static void setImageBasepath(String basepath,
  30. List<Map<String, Object>> list) {
  31. if (list != null && list.size() > 0) {
  32. for (Map<String, Object> map : list) {
  33. if (map != null) {
  34. if (map.get("imgurl") != null)
  35. map.put("imgurl", basepath + map.get("imgurl"));
  36. }
  37. }
  38. }
  39. }
  40. public static String getUploadpath(String uploaddir, String relativePath) {
  41. String uploadpath = uploaddir + relativePath;
  42. File file = new File(uploadpath);
  43. if (!file.exists())
  44. file.mkdirs();
  45. return uploadpath;
  46. }
  47. /**
  48. * 将null转换为空字符串
  49. * @author yulong.zhao
  50. *
  51. * @date 2016年11月9日上午11:48:49
  52. * @param object
  53. * @return
  54. */
  55. public static String nullToBlank(Object object){
  56. if(object == null){
  57. return "";
  58. }else{
  59. return String.valueOf(object);
  60. }
  61. }
  62. /**
  63. * 驼峰命名xxx_abc -> xxxAbc
  64. */
  65. public static String underlineToCamel(String name) {
  66. name = name.trim();
  67. int len = name.length();
  68. StringBuilder sb = new StringBuilder(len);
  69. for (int i = 0; i < len; i++) {
  70. char c = name.charAt(i);
  71. if (c == '_') {
  72. if (++i < len) {
  73. sb.append(Character.toUpperCase(name.charAt(i)));
  74. }
  75. } else {
  76. sb.append(c);
  77. }
  78. }
  79. return sb.toString();
  80. }
  81. /**
  82. * 驼峰转下划线
  83. * @param str 需要转换的字符串
  84. * @return
  85. */
  86. public static String camelToUnderline(String str) {
  87. Pattern humpPattern = Pattern.compile("[A-Z]");
  88. Matcher matcher = humpPattern.matcher(str);
  89. StringBuffer sb = new StringBuffer();
  90. while (matcher.find()) {
  91. matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
  92. }
  93. matcher.appendTail(sb);
  94. return sb.toString();
  95. }
  96. /**
  97. * 判断是否是空字符串 null和"" 都返回 true
  98. *
  99. * @author Robin Chang
  100. * @param s
  101. * @return
  102. */
  103. public static boolean isEmpty(String s) {
  104. if (s != null && !s.equals("")) {
  105. return false;
  106. }
  107. return true;
  108. }
  109. /**
  110. * 连接对象
  111. * @param objs
  112. * @return
  113. */
  114. public static String concat(Object...objs) {
  115. if(objs==null || objs.length<1)return EMPTY_STRING;
  116. StringBuffer sb = new StringBuffer();
  117. for(Object obj : objs){
  118. sb.append(obj==null?EMPTY_STRING:obj.toString());
  119. }
  120. return sb.toString();
  121. }
  122. /**
  123. * 获得int
  124. * @param val
  125. * @return
  126. */
  127. public static int getInt(String val){
  128. return getInt(val,-1);
  129. }
  130. /**
  131. * 获得int
  132. * @param val
  133. * @return
  134. */
  135. public static int getInt(Object val){
  136. if(val == null) return -1;
  137. return getInt(val.toString(),-1);
  138. }
  139. /**
  140. * 获得int
  141. * @param val
  142. * @param def
  143. * @return
  144. */
  145. public static int getInt(Object val,int def){
  146. try{
  147. return Integer.parseInt(val.toString().trim());
  148. }catch(Exception e){
  149. return def;
  150. }
  151. }
  152. /**
  153. * 获得long
  154. * @param val
  155. * @return
  156. */
  157. public static long getLong(String val ) {
  158. return getLong(val,-1);
  159. }
  160. /**
  161. * 获得long
  162. * @param object
  163. * @return
  164. */
  165. public static long getLong(Object object) {
  166. return getLong(get(object.toString(),"-1"),-1);
  167. }
  168. /**
  169. * 获得long
  170. * @param val
  171. * @param def
  172. * @return
  173. */
  174. public static long getLong(String val,long def){
  175. try{
  176. return Long.parseLong(val.trim());
  177. }catch(Exception e){
  178. return -1;
  179. }
  180. }
  181. /**
  182. * 获得boolean
  183. * @param val
  184. * @return
  185. */
  186. public static boolean getBoolean(String val){
  187. return getBoolean(val,false);
  188. }
  189. /**
  190. * 获得boolean
  191. * @param val
  192. * @param def
  193. * @return
  194. */
  195. public static boolean getBoolean(String val,boolean def){
  196. if(ValidateUtil.isNull(val))return def;
  197. try{
  198. return Boolean.parseBoolean(val);
  199. }catch(Exception e){
  200. return def;
  201. }
  202. }
  203. /**
  204. * 获得double
  205. * @param value
  206. * @return
  207. */
  208. public static double getDouble(String value){
  209. return getDouble(value,0.00);
  210. }
  211. /**
  212. * 获得double
  213. * @param value
  214. * @param def
  215. * @return
  216. */
  217. public static double getDouble(String value,double def){
  218. try{
  219. return Double.valueOf(value).doubleValue();
  220. }catch(Exception e){
  221. return def;
  222. }
  223. }
  224. /**
  225. * 返回Trim后的值
  226. * @param val
  227. * @return
  228. */
  229. public static String getTrim(String val){
  230. val = getNonNull(val);
  231. return val.trim();
  232. }
  233. /**
  234. * 如果为null返回空字符串
  235. * @param val
  236. * @return
  237. */
  238. public static String getNonNull(String val){
  239. return get(val,EMPTY_STRING);
  240. }
  241. /**
  242. * 获得BigDecimal
  243. * @param str
  244. * @return
  245. */
  246. public static BigDecimal getBigDecimal(String str){
  247. try{
  248. BigDecimal bd = new BigDecimal(str);
  249. return bd;
  250. }catch(Exception e){
  251. return BigDecimal.valueOf(-1.00);
  252. }
  253. }
  254. /**
  255. * 获得BigDecimal
  256. * @param str
  257. * @return
  258. */
  259. public static BigDecimal getBigDecimal(String str,double def){
  260. try{
  261. BigDecimal bd = new BigDecimal(str);
  262. return bd;
  263. }catch(Exception e){
  264. return BigDecimal.valueOf(def);
  265. }
  266. }
  267. /**
  268. * yes/no转换成true/false
  269. * @param aValue
  270. * @return
  271. */
  272. public static final String getBooleanFromYesNo(String aValue) {
  273. if (aValue.equalsIgnoreCase("yes")) {
  274. return "true";
  275. }
  276. return "false";
  277. }
  278. /**
  279. * 替换字符串
  280. * @param text 原始文本
  281. * @param replaced 要替换内容
  282. * @param replacement 替换内容
  283. * @return
  284. */
  285. public static String replace(String text, String replaced, String replacement) {
  286. StringBuffer ret = new StringBuffer();
  287. String temp = text;
  288. while (temp.indexOf(replaced) > -1) {
  289. ret.append(temp.substring(0, temp.indexOf(replaced)) + replacement);
  290. temp = temp.substring(temp.indexOf(replaced) + replaced.length());
  291. }
  292. ret.append(temp);
  293. return ret.toString();
  294. }
  295. /**
  296. * 字符串替换 正反向
  297. * @param sIni
  298. * @param sFrom
  299. * @param sTo
  300. * @param caseSensitiveSearch
  301. * @return
  302. */
  303. public static String replaceString(String sIni, String sFrom, String sTo, boolean caseSensitiveSearch) {
  304. int i = 0;
  305. String s = new String(sIni);
  306. StringBuffer result = new StringBuffer();
  307. if (caseSensitiveSearch) {
  308. i = s.indexOf(sFrom);
  309. } else {
  310. i = s.toLowerCase().indexOf(sFrom.toLowerCase());
  311. }
  312. while (i != -1) {
  313. result.append(s.substring(0, i));
  314. result.append(sTo);
  315. s = s.substring(i + sFrom.length());
  316. if (caseSensitiveSearch) {
  317. i = s.indexOf(sFrom);
  318. } else {
  319. i = s.toLowerCase().indexOf(sFrom.toLowerCase());
  320. }
  321. }
  322. result.append(s);
  323. return result.toString();
  324. }
  325. /**
  326. * 将字符串转换成Vector通过Token
  327. * @param sIn
  328. * @param sTokenizer
  329. * @return
  330. */
  331. public static List<String> tokenize(String sIn, String sTokenizer) {
  332. if(ValidateUtil.isNull(sIn))return new Vector<String>();
  333. Vector<String> vToken = new Vector<String>();
  334. int nOffset = 0;
  335. int nOffset1 = 0;
  336. nOffset1 = sIn.indexOf(sTokenizer, nOffset);
  337. while (nOffset1 > -1) {
  338. if (nOffset1 > nOffset) {
  339. vToken.add(sIn.substring(nOffset, nOffset1));
  340. } else {
  341. vToken.add(EMPTY_STRING);
  342. }
  343. nOffset = nOffset1 + sTokenizer.length();
  344. nOffset1 = sIn.indexOf(sTokenizer, nOffset);
  345. }
  346. if (nOffset < sIn.length()) {
  347. vToken.add(sIn.substring(nOffset, sIn.length()));
  348. } else {
  349. vToken.add(EMPTY_STRING);
  350. }
  351. return vToken;
  352. }
  353. /**
  354. * 将字符串转换成字符数组通过token
  355. * @param sIn
  356. * @param sTokenizer
  357. * @return
  358. */
  359. public static String[] tokenizeToArray(String sIn, String sTokenizer) {
  360. if(ValidateUtil.isNull(sIn)){
  361. return new String[0];
  362. }
  363. List<String> vToken = tokenize(sIn, sTokenizer);
  364. String[] tokenArray = new String[vToken.size()];
  365. for (int i = 0; i < vToken.size(); i++) {
  366. tokenArray[i] = getTrim((String) vToken.get(i));
  367. }
  368. return tokenArray;
  369. }
  370. /**
  371. * 删除不能成为文件名的字符
  372. * @param fileStr
  373. * @return
  374. */
  375. public static String removeIllegalFileChars(String fileStr) {
  376. String replacedFileStr = fileStr;
  377. replacedFileStr = replace(replacedFileStr, " ", "_");
  378. replacedFileStr = replace(replacedFileStr, "&", EMPTY_STRING);
  379. replacedFileStr = replace(replacedFileStr, "%", EMPTY_STRING);
  380. replacedFileStr = replace(replacedFileStr, ",", EMPTY_STRING);
  381. replacedFileStr = replace(replacedFileStr, ";", EMPTY_STRING);
  382. replacedFileStr = replace(replacedFileStr, "/", "_");
  383. return replacedFileStr;
  384. }
  385. /**
  386. * 获得字符串中的指点子字符串
  387. * @param strIn
  388. * @param start
  389. * @param length
  390. * @return
  391. */
  392. public static String substring(String strIn, int start, int length){
  393. String strOut = null;
  394. if (strIn != null) {
  395. strOut = EMPTY_STRING;
  396. if (start < strIn.length() && length > 0) {
  397. if (start + length < strIn.length() ) {
  398. strOut = strIn.substring(start, start + length );
  399. } else {
  400. strOut = strIn.substring(start, strIn.length() );
  401. }
  402. }
  403. }
  404. return strOut;
  405. }
  406. /**
  407. * 随机生成length位数字字符串
  408. * @param length
  409. * @return
  410. */
  411. public static final String getRandomLengthDigit(int length){
  412. StringBuilder str=new StringBuilder();
  413. for(int i=0;i<length;i++){
  414. str.append(IntChars[(int)(Math.random()*10)]);
  415. }
  416. return str.toString();
  417. }
  418. /**
  419. * 随即生成length位字符串
  420. * @param length
  421. * @return
  422. */
  423. public static final String getRandomLengthString(int length){
  424. if(length < 1)
  425. return null;
  426. char ac[] = new char[length];
  427. for(int j = 0; j < ac.length; j++)
  428. ac[j] = chars[new Random().nextInt(71)];
  429. return new String(ac);
  430. }
  431. /**
  432. * 随即生成i位中文
  433. * @param i
  434. * @return
  435. */
  436. public static final String getRandomLengthChineseString(int length){
  437. StringBuilder sb = new StringBuilder();
  438. for (int i = length; i > 0; i--) {
  439. sb.append(getRandomChinese());
  440. }
  441. return sb.toString();
  442. }
  443. /**
  444. * 随机产生中文,长度范围为start-end
  445. * @param start
  446. * @param end
  447. * @return
  448. */
  449. public static String getRandomLengthChiness(int start, int end) {
  450. StringBuilder sb = new StringBuilder();
  451. int length = new Random().nextInt(end + 1);
  452. if (length < start) {
  453. return getRandomLengthChiness(start, end);
  454. } else {
  455. for (int i = 0; i < length; i++) {
  456. sb.append(getRandomChinese());
  457. }
  458. }
  459. return sb.toString();
  460. }
  461. /**
  462. * 随机获得中文
  463. * @return
  464. */
  465. public static String getRandomChinese() {
  466. String str = null;
  467. int highPos, lowPos;
  468. Random random = new Random();;
  469. highPos = (176 + Math.abs(random.nextInt(39)));
  470. lowPos = 161 + Math.abs(random.nextInt(93));
  471. byte[] b = new byte[2];
  472. b[0] = (new Integer(highPos)).byteValue();
  473. b[1] = (new Integer(lowPos)).byteValue();
  474. try {
  475. str = new String(b, "GB2312");
  476. } catch (UnsupportedEncodingException e) {
  477. e.printStackTrace();
  478. }
  479. return str;
  480. }
  481. /**
  482. * 获得XML中的CDATA格式数据
  483. * @param text
  484. * @return
  485. */
  486. public static String getCDATAData(String text){
  487. if(!ValidateUtil.isNotNull(text)) return EMPTY_STRING;
  488. return new StringBuffer().append("<![CDATA[").append(text).append("]]>").toString();
  489. }
  490. /**
  491. * 编码
  492. * @param str 要编码的字符串
  493. * @param charset 编码类型
  494. * @param ss 可选,原来的类型
  495. * @return
  496. */
  497. public static String encode(String str,String charset,String...ss ){
  498. if(ValidateUtil.isNull(str))return EMPTY_STRING;
  499. if(ValidateUtil.isNull(charset))return str;
  500. try {
  501. if(ss!=null && ss.length>0)return new String(str.getBytes(ss[0]),charset);
  502. else return new String(str.getBytes(),charset);
  503. } catch (UnsupportedEncodingException e) {
  504. return str;
  505. }
  506. }
  507. /**
  508. * 如果为null返回默认值
  509. * @param str
  510. * @param def
  511. * @return
  512. */
  513. public static String get(Object obj, String def) {
  514. if(obj==null) return def;
  515. return ValidateUtil.isNull(obj.toString())?def:obj.toString();
  516. }
  517. /**
  518. * 删除额外的空格,保证一个空格
  519. * @param str
  520. * @return
  521. */
  522. public static String removeExtraBlanks(String str) {
  523. if(ValidateUtil.isNull(str))return EMPTY_STRING;
  524. char[] chars = str.toCharArray();
  525. int finalIndex = 0;
  526. int spaceCount = 0;
  527. for (int i = 0; i < chars.length; ++i) {
  528. if (chars[i] != ' ') {
  529. chars[finalIndex] = chars[i];
  530. ++finalIndex;
  531. spaceCount = 0;
  532. } else if (chars[i] == ' ' && finalIndex == 0) {
  533. } else if (chars[i] == ' ' && spaceCount == 0) {
  534. chars[finalIndex] = chars[i];
  535. ++finalIndex;
  536. ++spaceCount;
  537. } else if (chars[i] == ' ' && spaceCount > 0) {
  538. ++spaceCount;
  539. }
  540. }
  541. for (int i = finalIndex; i < chars.length; ++i) {
  542. chars[i] = ' ';
  543. }
  544. return String.valueOf(chars);
  545. }
  546. /**
  547. * 删除所有空格
  548. * @param str
  549. * @return
  550. */
  551. public static String removeBlanks(String str){
  552. if(str == null || str.equals(EMPTY_STRING))
  553. return str;
  554. char ac[] = str.toCharArray();
  555. char ac1[] = new char[ac.length];
  556. int i = 0;
  557. for(int j = 0; j < ac.length; j++)
  558. if(!Character.isSpaceChar(ac[j]))
  559. ac1[i++] = ac[j];
  560. return new String(ac1, 0, i);
  561. }
  562. /**
  563. * 二行制转字符串
  564. * @param b
  565. * @return
  566. */
  567. public static String byte2hex(byte[] b) {
  568. StringBuilder hs = new StringBuilder();
  569. String stmp = EMPTY_STRING;
  570. for (int n = 0; n < b.length; n++) {
  571. stmp = (Integer.toHexString(b[n] & 0XFF));
  572. if (stmp.length() == 1)
  573. hs.append("0").append(stmp);
  574. else
  575. hs.append(stmp);
  576. }
  577. return hs.toString().toUpperCase();
  578. }
  579. /**
  580. * 获得List的字符串连接
  581. * @param list
  582. * @param split可选连接符
  583. * @return
  584. */
  585. public static String getStringFromList(List<String> list,String...split){
  586. if(list==null){
  587. return EMPTY_STRING;
  588. }
  589. StringBuilder sb=new StringBuilder();
  590. for(int i=0,j=list.size();i<j;i++){
  591. sb.append(list.get(i));
  592. if(split!=null && split.length>0)sb.append(split[0]);
  593. }
  594. return sb.toString();
  595. }
  596. /**
  597. * 连接数组
  598. * @param array
  599. * @param split
  600. * @return
  601. */
  602. public static String getStringFromArray(String[] array,String...split) {
  603. if(array==null)return EMPTY_STRING;
  604. StringBuilder sb=new StringBuilder();
  605. for(int i = 0 ;i<array.length ; i++){
  606. if(i>0 && split!=null && ValidateUtil.isNotNull(split[0]))sb.append(split[0]);
  607. sb.append(array[i]);
  608. }
  609. return sb.toString();
  610. }
  611. /**
  612. * 连接list
  613. * @param connector
  614. * @param list
  615. * @return
  616. */
  617. public static String concatList(String connector,List<?> list){
  618. return concatArray(connector,list.toArray(new Object[list.size()]));
  619. }
  620. /**
  621. * 连接数组
  622. * @param string
  623. * @param values
  624. * @return
  625. */
  626. public static <T> String concatArray(String connector,T...objects) {
  627. if(objects==null || objects.length<1)return EMPTY_STRING;
  628. StringBuffer sb = new StringBuffer();
  629. for(int i=0;i<objects.length;i++){
  630. if(objects[i]==null || ValidateUtil.isNull(objects[i].toString()))continue;
  631. if(i>0)sb.append(connector);
  632. sb.append(objects[i].toString());
  633. }
  634. return sb.toString();
  635. }
  636. /**
  637. * 自由组合列表
  638. * @param list
  639. * @return
  640. */
  641. public static List<String> combined(List<List<String>> list){
  642. if(list.size()==1){
  643. return list.get(0);
  644. }else
  645. if(list.size()==2){
  646. return combined(list.get(0),list.get(1));
  647. }
  648. else{
  649. List<String> tempList = new ArrayList<String>();
  650. for(int i=list.size();i>0;i--){
  651. tempList = combined(list.get(i-1),tempList);
  652. }
  653. return tempList;
  654. }
  655. }
  656. /**
  657. * 自由组合两列表
  658. * @param list1
  659. * @param list2
  660. * @return
  661. */
  662. public static List<String> combined(List<String> list1,List<String> list2){
  663. if(list2.isEmpty())return list1;
  664. List<String> results = new ArrayList<String>();
  665. for(String str1:list1){
  666. for(String str2:list2){
  667. results.add(str1+","+str2);
  668. }
  669. }
  670. return results;
  671. }
  672. /**
  673. * 字符串替换
  674. * @param text 原字符串
  675. * @param terms Map类型 Key:要替换内容 value:替换后内容
  676. * @return
  677. */
  678. public static String replaceAll(String text , Map<String,String> terms){
  679. String textResult = text;
  680. for(String key :terms.keySet()){
  681. if(ValidateUtil.isNotNull(key) && ValidateUtil.isNotNull(terms.get(key)))
  682. textResult = Pattern.compile(key).matcher(textResult).replaceAll(terms.get(key));
  683. }
  684. return textResult;
  685. }
  686. /**
  687. * 正则表达式替换
  688. * @param str 源字符串
  689. * @param pattern 要替换的模式
  690. * @param replacement 替换成的内容
  691. * @return
  692. */
  693. public static String regexReplace(String str,String pattern,String replacement){
  694. if(ValidateUtil.isNull(str))return EMPTY_STRING;
  695. if(ValidateUtil.isNull(pattern))return str;
  696. return str.replaceAll(pattern, replacement);
  697. }
  698. /**
  699. * 正则替换
  700. * @param str 源字符串
  701. * @param pattern 要替换的模式
  702. * @param replace 替换成的内容
  703. * @param connector 连接器
  704. * @param def 默认值
  705. * @return
  706. */
  707. public static String regex(String str,String pattern,String replace,String connector,String def){
  708. if(str==null || pattern==null || connector==null)return null;
  709. Pattern p = Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
  710. Matcher matcher = p.matcher(str);
  711. StringBuffer sb = new StringBuffer();
  712. int i = 0 ;
  713. for(i=0;matcher.find();i++){
  714. if(i>0)sb.append(connector);
  715. matcher.appendReplacement(sb,replace);
  716. }
  717. if(i>0)matcher.appendTail(sb).append(def);else sb.append(str);
  718. return sb.toString();
  719. }
  720. /**
  721. * 查找符合正则的表达式的字符串
  722. * @param str
  723. * @param pattern
  724. * @param index
  725. * @return
  726. */
  727. public static String regexFind(String str,String pattern,int index){
  728. if(ValidateUtil.isNull(str))return EMPTY_STRING;
  729. Pattern p = Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
  730. Matcher matcher = p.matcher(str);
  731. for(int i=1; matcher.find();i++){
  732. if(i==index){
  733. return matcher.group();
  734. }
  735. }
  736. return EMPTY_STRING;
  737. }
  738. /**
  739. * 将html文本去除成普通文本
  740. * @param html
  741. * @param style simple\basic\basicWithImages\relaxed\none
  742. * @return
  743. */
  744. public static String getText(String html,String style){
  745. if(ValidateUtil.isNull(html))return html;
  746. if(ValidateUtil.isEqualsIgnoreCase("simple", style)){
  747. return Jsoup.clean(html, Whitelist.simpleText());
  748. }else if(ValidateUtil.isEqualsIgnoreCase("basic", style)){
  749. return Jsoup.clean(html, Whitelist.basic());
  750. }else if(ValidateUtil.isEqualsIgnoreCase("basicWithImages", style)){
  751. return Jsoup.clean(html, Whitelist.basicWithImages());
  752. }else if(ValidateUtil.isEqualsIgnoreCase("relaxed", style)){
  753. return Jsoup.clean(html, Whitelist.relaxed());
  754. }else{
  755. return Jsoup.clean(html, Whitelist.none());
  756. }
  757. }
  758. /**
  759. * 将普通文本中的链接提取成超链接
  760. * @param text
  761. * @return
  762. */
  763. public static String getHrefText(String text){
  764. try{
  765. Pattern pattern = Pattern.compile(_HREF_URL_REGEX);
  766. Matcher matcher = pattern.matcher(text);
  767. StringBuffer result = new StringBuffer();
  768. String url ;
  769. while (matcher.find()) {
  770. url = matcher.group();
  771. StringBuffer replace = new StringBuffer();
  772. replace.append("<a href=\"").append(url);
  773. replace.append("\" target=\"_blank\">"+url+"</a>");
  774. matcher.appendReplacement(result, replace.toString());
  775. }
  776. matcher.appendTail(result);
  777. return get(result.toString(),text);
  778. }catch(Exception e){
  779. return text;
  780. }
  781. }
  782. /**
  783. * 字符串解析Map
  784. * @param text
  785. * @param termSplit
  786. * @param keySplit
  787. * @return
  788. */
  789. public static Map<String, String> getMap(String text,
  790. String termSplit, String keySplit) {
  791. Map<String,String> values = null;
  792. if(ValidateUtil.isNotNull(text)){
  793. values = new LinkedHashMap<String,String>();
  794. for(String line : StringUtil.tokenize(text, termSplit)){
  795. if(ValidateUtil.isNull(line))continue;
  796. String[] t = line.split(keySplit);
  797. if(t.length==1){
  798. values.put(StringUtil.getTrim(t[0]), StringUtil.getTrim(t[0]));
  799. continue;
  800. }
  801. if(t.length!=2)continue;
  802. values.put(t[0], StringUtil.getTrim(t[1]));
  803. }
  804. }
  805. return values==null?new HashMap<String,String>():values;
  806. }
  807. /**
  808. * 通过字节截断字符串长度
  809. * @param str
  810. * @param length
  811. * @param more
  812. * @return
  813. */
  814. public static String substringByByte(String str, int length,String more){
  815. int reInt = 0;
  816. String reStr = EMPTY_STRING;
  817. if (ValidateUtil.isNull(str)) return EMPTY_STRING;
  818. char[] tempChar = str.toCharArray();
  819. for (int kk = 0; (kk < tempChar.length && length > reInt); kk++) {
  820. String s1 = String.valueOf(tempChar[kk]);
  821. byte[] b = s1.getBytes();
  822. reInt += b.length;
  823. reStr += tempChar[kk];
  824. }
  825. if (length == reInt || (length == reInt - 1))
  826. reStr += more;
  827. return reStr;
  828. }
  829. /**
  830. * 获得指定小数位
  831. * @param value
  832. * @param fixed
  833. * @return
  834. */
  835. public static BigDecimal getFixedBigDecimal(String value, int fixed) {
  836. try{
  837. BigDecimal result = new BigDecimal(value);
  838. return result.setScale(fixed, BigDecimal.ROUND_HALF_UP);
  839. }catch(Exception e){
  840. }
  841. return BigDecimal.ZERO;
  842. }
  843. /**
  844. * 获得正则匹配的字符串
  845. * @param text
  846. * @param pattern
  847. * @param group
  848. * @return
  849. */
  850. public static String getMatcherGroup(String text,String pattern,int group){
  851. if(ValidateUtil.isNotNull(text) && ValidateUtil.isNotNull(pattern)){
  852. Pattern p = Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
  853. Matcher matcher = p.matcher(text);
  854. if(matcher.matches()){
  855. return matcher.group(group);
  856. }
  857. }
  858. return null;
  859. }
  860. }