¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.springblade.core.tool.support; |
| | | |
| | | import org.springblade.core.tool.utils.Func; |
| | | import org.springblade.core.tool.utils.StringPool; |
| | | import org.springblade.core.tool.utils.StringUtil; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | /** |
| | | * å符串ååå¨ |
| | | * |
| | | * @author Looly |
| | | */ |
| | | public class StrSpliter { |
| | | |
| | | //---------------------------------------------------------------------------------------------- Split by char |
| | | |
| | | /** |
| | | * ååå符串路å¾ï¼ä»
æ¯æUnixåç符ï¼/ |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> splitPath(String str) { |
| | | return splitPath(str, 0); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串路å¾ï¼ä»
æ¯æUnixåç符ï¼/ |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static String[] splitPathToArray(String str) { |
| | | return toArray(splitPath(str)); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串路å¾ï¼ä»
æ¯æUnixåç符ï¼/ |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param limit éå¶åçæ° |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> splitPath(String str, int limit) { |
| | | return split(str, StringPool.SLASH, limit, true, true); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串路å¾ï¼ä»
æ¯æUnixåç符ï¼/ |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param limit éå¶åçæ° |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static String[] splitPathToArray(String str, int limit) { |
| | | return toArray(splitPath(str, limit)); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串 |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> splitTrim(String str, char separator, boolean ignoreEmpty) { |
| | | return split(str, separator, 0, true, ignoreEmpty); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串 |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> split(String str, char separator, boolean isTrim, boolean ignoreEmpty) { |
| | | return split(str, separator, 0, isTrim, ignoreEmpty); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼å¤§å°åææï¼å»é¤æ¯ä¸ªå
ç´ ä¸¤è¾¹ç©ºç½ç¬¦ |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param limit éå¶åçæ°ï¼-1ä¸éå¶ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> splitTrim(String str, char separator, int limit, boolean ignoreEmpty) { |
| | | return split(str, separator, limit, true, ignoreEmpty, false); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼å¤§å°åææ |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param limit éå¶åçæ°ï¼-1ä¸éå¶ |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> split(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | return split(str, separator, limit, isTrim, ignoreEmpty, false); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼å¿½ç¥å¤§å°å |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param limit éå¶åçæ°ï¼-1ä¸éå¶ |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> splitIgnoreCase(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | return split(str, separator, limit, isTrim, ignoreEmpty, true); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串 |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param limit éå¶åçæ°ï¼-1ä¸éå¶ |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @param ignoreCase æ¯å¦å¿½ç¥å¤§å°å |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> split(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty, boolean ignoreCase) { |
| | | if (StringUtil.isEmpty(str)) { |
| | | return new ArrayList<String>(0); |
| | | } |
| | | if (limit == 1) { |
| | | return addToList(new ArrayList<String>(1), str, isTrim, ignoreEmpty); |
| | | } |
| | | |
| | | final ArrayList<String> list = new ArrayList<>(limit > 0 ? limit : 16); |
| | | int len = str.length(); |
| | | int start = 0; |
| | | for (int i = 0; i < len; i++) { |
| | | if (Func.equals(separator, str.charAt(i))) { |
| | | addToList(list, str.substring(start, i), isTrim, ignoreEmpty); |
| | | start = i + 1; |
| | | |
| | | //æ£æ¥æ¯å¦è¶
åºèå´ï¼æå¤§å
许limit-1个ï¼å©ä¸ä¸ä¸ªçç»æ«å°¾åç¬¦ä¸²ï¼ |
| | | if (limit > 0 && list.size() > limit - 2) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | return addToList(list, str.substring(start, len), isTrim, ignoreEmpty); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串为å符串æ°ç» |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param limit éå¶åçæ° |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static String[] splitToArray(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | return toArray(split(str, separator, limit, isTrim, ignoreEmpty)); |
| | | } |
| | | |
| | | //---------------------------------------------------------------------------------------------- Split by String |
| | | |
| | | /** |
| | | * ååå符串ï¼ä¸å¿½ç¥å¤§å°å |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符串 |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> split(String str, String separator, boolean isTrim, boolean ignoreEmpty) { |
| | | return split(str, separator, -1, isTrim, ignoreEmpty, false); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼å»é¤æ¯ä¸ªå
ç´ ä¸¤è¾¹ç©ºæ ¼ï¼å¿½ç¥å¤§å°å |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符串 |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> splitTrim(String str, String separator, boolean ignoreEmpty) { |
| | | return split(str, separator, true, ignoreEmpty); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼ä¸å¿½ç¥å¤§å°å |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符串 |
| | | * @param limit éå¶åçæ° |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> split(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | return split(str, separator, limit, isTrim, ignoreEmpty, false); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼å»é¤æ¯ä¸ªå
ç´ ä¸¤è¾¹ç©ºæ ¼ï¼å¿½ç¥å¤§å°å |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符串 |
| | | * @param limit éå¶åçæ° |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> splitTrim(String str, String separator, int limit, boolean ignoreEmpty) { |
| | | return split(str, separator, limit, true, ignoreEmpty); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼å¿½ç¥å¤§å°å |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符串 |
| | | * @param limit éå¶åçæ° |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> splitIgnoreCase(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | return split(str, separator, limit, isTrim, ignoreEmpty, true); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串ï¼å»é¤æ¯ä¸ªå
ç´ ä¸¤è¾¹ç©ºæ ¼ï¼å¿½ç¥å¤§å°å |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符串 |
| | | * @param limit éå¶åçæ° |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> splitTrimIgnoreCase(String str, String separator, int limit, boolean ignoreEmpty) { |
| | | return split(str, separator, limit, true, ignoreEmpty, true); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串 |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符串 |
| | | * @param limit éå¶åçæ° |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @param ignoreCase æ¯å¦å¿½ç¥å¤§å°å |
| | | * @return åååçéå |
| | | * @since 3.2.1 |
| | | */ |
| | | public static List<String> split(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty, boolean ignoreCase) { |
| | | if (StringUtil.isEmpty(str)) { |
| | | return new ArrayList<String>(0); |
| | | } |
| | | if (limit == 1) { |
| | | return addToList(new ArrayList<String>(1), str, isTrim, ignoreEmpty); |
| | | } |
| | | |
| | | if (StringUtil.isEmpty(separator)) { |
| | | return split(str, limit); |
| | | } else if (separator.length() == 1) { |
| | | return split(str, separator.charAt(0), limit, isTrim, ignoreEmpty, ignoreCase); |
| | | } |
| | | |
| | | final ArrayList<String> list = new ArrayList<>(); |
| | | int len = str.length(); |
| | | int separatorLen = separator.length(); |
| | | int start = 0; |
| | | int i = 0; |
| | | while (i < len) { |
| | | i = StringUtil.indexOf(str, separator, start, ignoreCase); |
| | | if (i > -1) { |
| | | addToList(list, str.substring(start, i), isTrim, ignoreEmpty); |
| | | start = i + separatorLen; |
| | | |
| | | //æ£æ¥æ¯å¦è¶
åºèå´ï¼æå¤§å
许limit-1个ï¼å©ä¸ä¸ä¸ªçç»æ«å°¾åç¬¦ä¸²ï¼ |
| | | if (limit > 0 && list.size() > limit - 2) { |
| | | break; |
| | | } |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | | return addToList(list, str.substring(start, len), isTrim, ignoreEmpty); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串为å符串æ°ç» |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separator åé符å符 |
| | | * @param limit éå¶åçæ° |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static String[] splitToArray(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | return toArray(split(str, separator, limit, isTrim, ignoreEmpty)); |
| | | } |
| | | |
| | | //---------------------------------------------------------------------------------------------- Split by Whitespace |
| | | |
| | | /** |
| | | * 使ç¨ç©ºç½ç¬¦ååå符串<br> |
| | | * åååçå符串两边ä¸å
å«ç©ºç½ç¬¦ï¼ç©ºä¸²æç©ºç½ç¬¦ä¸²å¹¶ä¸å为å
ç´ ä¹ä¸ |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param limit éå¶åçæ° |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> split(String str, int limit) { |
| | | if (StringUtil.isEmpty(str)) { |
| | | return new ArrayList<String>(0); |
| | | } |
| | | if (limit == 1) { |
| | | return addToList(new ArrayList<String>(1), str, true, true); |
| | | } |
| | | |
| | | final ArrayList<String> list = new ArrayList<>(); |
| | | int len = str.length(); |
| | | int start = 0; |
| | | for (int i = 0; i < len; i++) { |
| | | if (Func.isEmpty(str.charAt(i))) { |
| | | addToList(list, str.substring(start, i), true, true); |
| | | start = i + 1; |
| | | if (limit > 0 && list.size() > limit - 2) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | return addToList(list, str.substring(start, len), true, true); |
| | | } |
| | | |
| | | /** |
| | | * ååå符串为å符串æ°ç» |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param limit éå¶åçæ° |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static String[] splitToArray(String str, int limit) { |
| | | return toArray(split(str, limit)); |
| | | } |
| | | |
| | | //---------------------------------------------------------------------------------------------- Split by regex |
| | | |
| | | /** |
| | | * éè¿æ£åååå符串 |
| | | * |
| | | * @param str å符串 |
| | | * @param separatorPattern åé符æ£å{@link Pattern} |
| | | * @param limit éå¶åçæ° |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static List<String> split(String str, Pattern separatorPattern, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | if (StringUtil.isEmpty(str)) { |
| | | return new ArrayList<String>(0); |
| | | } |
| | | if (limit == 1) { |
| | | return addToList(new ArrayList<String>(1), str, isTrim, ignoreEmpty); |
| | | } |
| | | |
| | | if (null == separatorPattern) { |
| | | return split(str, limit); |
| | | } |
| | | |
| | | final Matcher matcher = separatorPattern.matcher(str); |
| | | final ArrayList<String> list = new ArrayList<>(); |
| | | int len = str.length(); |
| | | int start = 0; |
| | | while (matcher.find()) { |
| | | addToList(list, str.substring(start, matcher.start()), isTrim, ignoreEmpty); |
| | | start = matcher.end(); |
| | | |
| | | if (limit > 0 && list.size() > limit - 2) { |
| | | break; |
| | | } |
| | | } |
| | | return addToList(list, str.substring(start, len), isTrim, ignoreEmpty); |
| | | } |
| | | |
| | | /** |
| | | * éè¿æ£åååå符串为å符串æ°ç» |
| | | * |
| | | * @param str 被ååçå符串 |
| | | * @param separatorPattern åé符æ£å{@link Pattern} |
| | | * @param limit éå¶åçæ° |
| | | * @param isTrim æ¯å¦å»é¤åååç¬¦ä¸²åæ¯ä¸ªå
ç´ ä¸¤è¾¹çç©ºæ ¼ |
| | | * @param ignoreEmpty æ¯å¦å¿½ç¥ç©ºä¸² |
| | | * @return åååçéå |
| | | * @since 3.0.8 |
| | | */ |
| | | public static String[] splitToArray(String str, Pattern separatorPattern, int limit, boolean isTrim, boolean ignoreEmpty) { |
| | | return toArray(split(str, separatorPattern, limit, isTrim, ignoreEmpty)); |
| | | } |
| | | |
| | | //---------------------------------------------------------------------------------------------- Split by length |
| | | |
| | | /** |
| | | * æ ¹æ®ç»å®é¿åº¦ï¼å°ç»å®å符串æªå为å¤ä¸ªé¨å |
| | | * |
| | | * @param str å符串 |
| | | * @param len æ¯ä¸ä¸ªå°èçé¿åº¦ |
| | | * @return æªååçå符串æ°ç» |
| | | */ |
| | | public static String[] splitByLength(String str, int len) { |
| | | int partCount = str.length() / len; |
| | | int lastPartCount = str.length() % len; |
| | | int fixPart = 0; |
| | | if (lastPartCount != 0) { |
| | | fixPart = 1; |
| | | } |
| | | |
| | | final String[] strs = new String[partCount + fixPart]; |
| | | for (int i = 0; i < partCount + fixPart; i++) { |
| | | if (i == partCount + fixPart - 1 && lastPartCount != 0) { |
| | | strs[i] = str.substring(i * len, i * len + lastPartCount); |
| | | } else { |
| | | strs[i] = str.substring(i * len, i * len + len); |
| | | } |
| | | } |
| | | return strs; |
| | | } |
| | | |
| | | //---------------------------------------------------------------------------------------------------------- Private method start |
| | | |
| | | /** |
| | | * å°å符串å å
¥Listä¸ |
| | | * |
| | | * @param list å表 |
| | | * @param part 被å å
¥çé¨å |
| | | * @param isTrim æ¯å¦å»é¤ä¸¤ç«¯ç©ºç½ç¬¦ |
| | | * @param ignoreEmpty æ¯å¦ç¥è¿ç©ºå符串ï¼ç©ºå符串ä¸å为ä¸ä¸ªå
ç´ ï¼ |
| | | * @return å表 |
| | | */ |
| | | private static List<String> addToList(List<String> list, String part, boolean isTrim, boolean ignoreEmpty) { |
| | | part = part.toString(); |
| | | if (isTrim) { |
| | | part = part.trim(); |
| | | } |
| | | if (false == ignoreEmpty || false == part.isEmpty()) { |
| | | list.add(part); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * List转Array |
| | | * |
| | | * @param list List |
| | | * @return Array |
| | | */ |
| | | private static String[] toArray(List<String> list) { |
| | | return list.toArray(new String[list.size()]); |
| | | } |
| | | //---------------------------------------------------------------------------------------------------------- Private method end |
| | | } |