diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java
index 2edf65727..1afbfbd18 100644
--- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableBool.java
@@ -3,7 +3,7 @@ package cn.hutool.core.lang.mutable;
import java.io.Serializable;
/**
- * 可变 boolean
类型
+ * 可变 {@code boolean} 类型
*
* @see Boolean
* @since 3.0.1
@@ -59,12 +59,12 @@ public class MutableBool implements Comparable, Mutable, S
* 相等需同时满足如下条件:
*
* - 非空
- * - 类型为 {@link MutableBool}
+ * - 类型为 MutableBool
* - 值相等
*
*
* @param obj 比对的对象
- * @return 相同返回true
,否则 false
+ * @return 相同返回true
,否则 {@code false}
*/
@Override
public boolean equals(final Object obj) {
@@ -83,7 +83,7 @@ public class MutableBool implements Comparable, Mutable, S
/**
* 比较
*
- * @param other 其它 {@link MutableBool} 对象
+ * @param other 其它 MutableBool 对象
* @return x==y返回0,x<y返回-1,x>y返回1
*/
@Override
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java
index 0d0755bf8..55d539fc4 100644
--- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableByte.java
@@ -3,7 +3,7 @@ package cn.hutool.core.lang.mutable;
import cn.hutool.core.util.NumberUtil;
/**
- * 可变 byte
类型
+ * 可变 {@code byte} 类型
*
* @see Byte
* @since 3.0.1
@@ -157,12 +157,12 @@ public class MutableByte extends Number implements Comparable, Muta
* 相等需同时满足如下条件:
*
* - 非空
- * - 类型为 {@link MutableByte}
+ * - 类型为 MutableByte
* - 值相等
*
*
* @param obj 比对的对象
- * @return 相同返回true
,否则 false
+ * @return 相同返回true
,否则 {@code false}
*/
@Override
public boolean equals(final Object obj) {
@@ -181,7 +181,7 @@ public class MutableByte extends Number implements Comparable, Muta
/**
* 比较
*
- * @param other 其它 {@link MutableByte} 对象
+ * @param other 其它 MutableByte 对象
* @return x==y返回0,x<y返回-1,x>y返回1
*/
@Override
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java
index b516c454e..72a490366 100644
--- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableObj.java
@@ -3,7 +3,7 @@ package cn.hutool.core.lang.mutable;
import java.io.Serializable;
/**
- * 可变Object
+ * 可变{@code Object}
*
* @param 可变的类型
* @since 3.0.1
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java
index 19bced433..e9212367f 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java
@@ -3,11 +3,13 @@ package cn.hutool.core.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.exceptions.UtilException;
+import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Holder;
import cn.hutool.core.lang.PatternPool;
import cn.hutool.core.lang.RegexPool;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.lang.func.Func1;
+import cn.hutool.core.lang.mutable.MutableObj;
import cn.hutool.core.map.MapUtil;
import java.util.ArrayList;
@@ -17,6 +19,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
+import java.util.function.Consumer;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -138,11 +141,9 @@ public class ReUtil {
return null;
}
- final Matcher matcher = pattern.matcher(content);
- if (matcher.find()) {
- return matcher.group(groupIndex);
- }
- return null;
+ final MutableObj result = new MutableObj<>();
+ get(pattern, content, matcher -> result.set(matcher.group(groupIndex)));
+ return result.get();
}
/**
@@ -158,11 +159,29 @@ public class ReUtil {
if (null == content || null == pattern || null == groupName) {
return null;
}
+
+ final MutableObj result = new MutableObj<>();
+ get(pattern, content, matcher -> result.set(matcher.group(groupName)));
+ return result.get();
+ }
+
+ /**
+ * 在给定字符串中查找给定规则的字符,如果找到则使用{@link Consumer}处理之
+ * 如果内容中有多个匹配项,则只处理找到的第一个结果。
+ *
+ * @param pattern 匹配的正则
+ * @param content 被匹配的内容
+ * @param consumer 匹配到的内容处理器
+ * @since 5.7.15
+ */
+ public static void get(Pattern pattern, CharSequence content, Consumer consumer) {
+ if (null == content || null == pattern || null == consumer) {
+ return;
+ }
final Matcher m = pattern.matcher(content);
if (m.find()) {
- return m.group(groupName);
+ consumer.accept(m);
}
- return null;
}
/**
@@ -225,7 +244,7 @@ public class ReUtil {
if (m.find()) {
// 通过反射获取 namedGroups 方法
final Map map = ReflectUtil.invoke(pattern, "namedGroups");
- map.forEach((key, value)-> result.put(key, m.group(value)));
+ map.forEach((key, value) -> result.put(key, m.group(value)));
}
return result;
}
@@ -278,7 +297,6 @@ public class ReUtil {
return null;
}
- // Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
final Pattern pattern = PatternPool.get(regex, Pattern.DOTALL);
return extractMulti(pattern, content, template);
}
@@ -329,7 +347,6 @@ public class ReUtil {
return null;
}
- // Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
final Pattern pattern = PatternPool.get(regex, Pattern.DOTALL);
return extractMultiAndDelPre(pattern, contentHolder, template);
}
@@ -346,7 +363,6 @@ public class ReUtil {
return StrUtil.str(content);
}
- // Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
final Pattern pattern = PatternPool.get(regex, Pattern.DOTALL);
return delFirst(pattern, content);
}
@@ -427,7 +443,6 @@ public class ReUtil {
return StrUtil.str(content);
}
- // Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
final Pattern pattern = PatternPool.get(regex, Pattern.DOTALL);
return delAll(pattern, content);
}
@@ -459,9 +474,23 @@ public class ReUtil {
return StrUtil.str(content);
}
- // Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
final Pattern pattern = PatternPool.get(regex, Pattern.DOTALL);
- Matcher matcher = pattern.matcher(content);
+ return delPre(pattern, content);
+ }
+
+ /**
+ * 删除正则匹配到的内容之前的字符 如果没有找到,则返回原文
+ *
+ * @param pattern 定位正则模式
+ * @param content 被查找的内容
+ * @return 删除前缀后的新内容
+ */
+ public static String delPre(Pattern pattern, CharSequence content) {
+ if (null == content || null == pattern) {
+ return StrUtil.str(content);
+ }
+
+ final Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
return StrUtil.sub(content, matcher.end(), content.length());
}
@@ -520,7 +549,7 @@ public class ReUtil {
return collection;
}
- return findAll(Pattern.compile(regex, Pattern.DOTALL), content, group, collection);
+ return findAll(PatternPool.get(regex, Pattern.DOTALL), content, group, collection);
}
/**
@@ -574,16 +603,29 @@ public class ReUtil {
if (null == pattern || null == content) {
return null;
}
+ Assert.notNull(collection, "Collection must be not null !");
- if (null == collection) {
- throw new NullPointerException("Null collection param provided!");
+ findAll(pattern, content, (matcher) -> collection.add(matcher.group(group)));
+ return collection;
+ }
+
+ /**
+ * 取得内容中匹配的所有结果,使用{@link Consumer}完成匹配结果处理
+ *
+ * @param pattern 编译后的正则模式
+ * @param content 被查找的内容
+ * @param consumer 匹配结果处理函数
+ * @since 5.7.15
+ */
+ public static void findAll(Pattern pattern, CharSequence content, Consumer consumer) {
+ if (null == pattern || null == content) {
+ return;
}
final Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
- collection.add(matcher.group(group));
+ consumer.accept(matcher);
}
- return collection;
}
/**
@@ -598,7 +640,6 @@ public class ReUtil {
return 0;
}
- // Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
final Pattern pattern = PatternPool.get(regex, Pattern.DOTALL);
return count(pattern, content);
}