ソースを参照

StrUtil添加subBetweenAll()方法

大火yzs 5 年 前
コミット
a0c78cf53c

+ 28 - 0
hutool-core/src/main/java/cn/hutool/core/lang/Console.java

@@ -179,4 +179,32 @@ public class Console {
 	public static String input() {
 	public static String input() {
 		return scanner().next();
 		return scanner().next();
 	}
 	}
+
+	// --------------------------------------------------------------------------------- console lineNumber
+	/**
+	 * 返回当前位置+行号 (不支持Lambda、内部类、递归内使用)
+	 *
+	 * @return 返回当前行号
+	 * @author dahuoyzs
+	 * @since 5.2.5
+	 */
+	public static String where() {
+		StackTraceElement stackTraceElement = new Throwable().getStackTrace()[1];
+		final String className = stackTraceElement.getClassName();
+		final String methodName = stackTraceElement.getMethodName();
+		final String fileName = stackTraceElement.getFileName();
+		final Integer lineNumber = stackTraceElement.getLineNumber();
+		return String.format("%s.%s(%s:%s)", className,methodName,fileName,lineNumber);
+	}
+
+	/**
+	 * 返回当前行号 (不支持Lambda、内部类、递归内使用)
+	 *
+	 * @return 返回当前行号
+	 * @since 5.2.5
+	 */
+	public static Integer lineNumber() {
+		return new Throwable().getStackTrace()[1].getLineNumber();
+	}
+
 }
 }

+ 68 - 5
hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java

@@ -5,12 +5,8 @@ import java.io.StringWriter;
 import java.nio.ByteBuffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.Charset;
 import java.text.MessageFormat;
 import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
 import java.util.Map.Entry;
-import java.util.Set;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
 
 
 import cn.hutool.core.comparator.VersionComparator;
 import cn.hutool.core.comparator.VersionComparator;
@@ -1953,6 +1949,73 @@ public class StrUtil {
 	}
 	}
 
 
 	/**
 	/**
+	 * 截取指定字符串多段中间部分,不包括标识字符串<br>
+	 *
+	 * 栗子:
+	 *
+	 * <pre>
+	 * StrUtil.subBetweenAll("wx[b]y[z]", "[", "]") 		= ["b","z"]
+	 * StrUtil.subBetweenAll(null, *, *)          			= []
+	 * StrUtil.subBetweenAll(*, null, *)          			= []
+	 * StrUtil.subBetweenAll(*, *, null)          			= []
+	 * StrUtil.subBetweenAll("", "", "")          			= []
+	 * StrUtil.subBetweenAll("", "", "]")         			= []
+	 * StrUtil.subBetweenAll("", "[", "]")        			= []
+	 * StrUtil.subBetweenAll("yabcz", "", "")     			= []
+	 * StrUtil.subBetweenAll("yabcz", "y", "z")   			= ["abc"]
+	 * StrUtil.subBetweenAll("yabczyabcz", "y", "z")   		= ["abc","abc"]
+	 * StrUtil.subBetweenAll("[yabc[zy]abcz]", "[", "]");   = ["zy"]           重叠时只截取内部,
+	 * </pre>
+	 *
+	 * @param str 被切割的字符串
+	 * @param regexBefore 截取开始的字符串标识
+	 * @param regexAfter 截取到的字符串标识
+	 * @return 截取后的字符串
+	 * @author dahuoyzs
+	 * @since 5.2.5
+	 */
+	public static String[] subBetweenAll(CharSequence str, CharSequence regexBefore, CharSequence regexAfter) {
+		if (str == null || regexBefore == null || regexAfter == null || str.length() < 1 || regexBefore.length() < 1 || regexAfter.length() < 1) {
+			return new String[0];
+		}
+
+		final String before = regexBefore.toString().replace("\\", "");
+		final String after = regexAfter.toString().replace("\\", "");
+		final Integer beforeNumber = StrUtil.count(str, before);
+		final Integer afterNumber = StrUtil.count(str, after);
+		if (beforeNumber<1||afterNumber<1){
+			return new String[0];
+		}
+
+		LinkedList<String> betweenList = new LinkedList<>();
+		if (beforeNumber.compareTo(afterNumber) > 0) {
+			String[] fragments = str.toString().split(regexAfter.toString());
+			for (int i = 0; i < fragments.length - 1; i++) {
+				String fragment = fragments[i];
+				if (fragment.contains(before)) {
+					int beforeIndex = StrUtil.lastIndexOf(fragment, before, 0, false);
+					String between = fragment.substring(beforeIndex);
+					if (between.length()>0)
+						betweenList.add(between);
+				}
+			}
+		} else {
+			String[] fragments = str.toString().split(regexBefore.toString());
+			for (int i = 1; i < fragments.length; i++) {
+				String fragment = fragments[i];
+				if (fragment.contains(after)) {
+					int afterIndex = StrUtil.indexOf(fragment, after, 0, false);
+					String between = fragment.substring(0, afterIndex);
+					if (between.length()>0)
+						betweenList.add(between);
+				}
+			}
+		}
+
+		return betweenList.toArray(new String[0]);
+	}
+
+	/**
 	 * 给定字符串是否被字符包围
 	 * 给定字符串是否被字符包围
 	 * 
 	 * 
 	 * @param str 字符串
 	 * @param str 字符串

+ 1 - 1
hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java

@@ -3,7 +3,6 @@ package cn.hutool.core.lang;
 import org.junit.Ignore;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.Test;
 
 
-import cn.hutool.core.lang.Console;
 import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.thread.ThreadUtil;
 
 
 /**
 /**
@@ -57,4 +56,5 @@ public class ConsoleTest {
 			ThreadUtil.sleep(200);
 			ThreadUtil.sleep(200);
 		}
 		}
 	}
 	}
+
 }
 }

+ 6 - 0
hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java

@@ -421,5 +421,11 @@ public class StrUtilTest {
 		Assert.assertEquals("1AB", StrUtil.padAfter("1", 3, "ABC"));
 		Assert.assertEquals("1AB", StrUtil.padAfter("1", 3, "ABC"));
 		Assert.assertEquals("23", StrUtil.padAfter("123", 2, "ABC"));
 		Assert.assertEquals("23", StrUtil.padAfter("123", 2, "ABC"));
 	}
 	}
+
+	@Test
+	public void subBetweenAllTest() {
+		Assert.assertArrayEquals(new String[]{"yz","abc"},StrUtil.subBetweenAll("saho[yz]fdsadp[abc]a","\\[","\\]"));
+		Assert.assertArrayEquals(new String[]{"abc"}, StrUtil.subBetweenAll("saho[yzfdsadp[abc]a]","\\[","\\]"));
+	}
 	
 	
 }
 }