|
|
@@ -1,6 +1,6 @@
|
|
|
package cn.hutool.core.util;
|
|
|
|
|
|
-import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.convert.Convert;
|
|
|
import cn.hutool.core.exceptions.UtilException;
|
|
|
import cn.hutool.core.lang.Holder;
|
|
|
@@ -8,30 +8,41 @@ import cn.hutool.core.lang.PatternPool;
|
|
|
import cn.hutool.core.lang.Validator;
|
|
|
import cn.hutool.core.lang.func.Func1;
|
|
|
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.TreeSet;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
/**
|
|
|
* 正则相关工具类<br>
|
|
|
* 常用正则请见 {@link Validator}
|
|
|
- *
|
|
|
+ *
|
|
|
* @author xiaoleilu
|
|
|
*/
|
|
|
public class ReUtil {
|
|
|
|
|
|
- /** 正则表达式匹配中文汉字 */
|
|
|
+ /**
|
|
|
+ * 正则表达式匹配中文汉字
|
|
|
+ */
|
|
|
public final static String RE_CHINESE = "[\u4E00-\u9FFF]";
|
|
|
- /** 正则表达式匹配中文字符串 */
|
|
|
+ /**
|
|
|
+ * 正则表达式匹配中文字符串
|
|
|
+ */
|
|
|
public final static String RE_CHINESES = RE_CHINESE + "+";
|
|
|
|
|
|
- /** 正则中需要被转义的关键字 */
|
|
|
- public final static Set<Character> RE_KEYS = CollectionUtil.newHashSet(new Character[] { '$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|' });
|
|
|
+ /**
|
|
|
+ * 正则中需要被转义的关键字
|
|
|
+ */
|
|
|
+ public final static Set<Character> RE_KEYS = CollUtil.newHashSet('$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|');
|
|
|
|
|
|
/**
|
|
|
* 获得匹配的字符串,获得正则中分组0的内容
|
|
|
- *
|
|
|
- * @param regex 匹配的正则
|
|
|
+ *
|
|
|
+ * @param regex 匹配的正则
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 匹配后得到的字符串,未匹配返回null
|
|
|
* @since 3.1.2
|
|
|
@@ -42,8 +53,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 获得匹配的字符串,获得正则中分组1的内容
|
|
|
- *
|
|
|
- * @param regex 匹配的正则
|
|
|
+ *
|
|
|
+ * @param regex 匹配的正则
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 匹配后得到的字符串,未匹配返回null
|
|
|
* @since 3.1.2
|
|
|
@@ -54,9 +65,9 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 获得匹配的字符串
|
|
|
- *
|
|
|
- * @param regex 匹配的正则
|
|
|
- * @param content 被匹配的内容
|
|
|
+ *
|
|
|
+ * @param regex 匹配的正则
|
|
|
+ * @param content 被匹配的内容
|
|
|
* @param groupIndex 匹配正则的分组序号
|
|
|
* @return 匹配后得到的字符串,未匹配返回null
|
|
|
*/
|
|
|
@@ -72,7 +83,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 获得匹配的字符串,,获得正则中分组0的内容
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 匹配后得到的字符串,未匹配返回null
|
|
|
@@ -84,7 +95,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 获得匹配的字符串,,获得正则中分组1的内容
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 匹配后得到的字符串,未匹配返回null
|
|
|
@@ -96,9 +107,9 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 获得匹配的字符串,对应分组0表示整个匹配内容,1表示第一个括号分组内容,依次类推
|
|
|
- *
|
|
|
- * @param pattern 编译后的正则模式
|
|
|
- * @param content 被匹配的内容
|
|
|
+ *
|
|
|
+ * @param pattern 编译后的正则模式
|
|
|
+ * @param content 被匹配的内容
|
|
|
* @param groupIndex 匹配正则的分组序号,0表示整个匹配内容,1表示第一个括号分组内容,依次类推
|
|
|
* @return 匹配后得到的字符串,未匹配返回null
|
|
|
*/
|
|
|
@@ -113,10 +124,10 @@ public class ReUtil {
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获得匹配的字符串匹配到的所有分组
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 匹配后得到的字符串数组,按照分组顺序依次列出,未匹配到返回空列表,任何一个参数为null返回null
|
|
|
@@ -128,9 +139,9 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 获得匹配的字符串匹配到的所有分组
|
|
|
- *
|
|
|
- * @param pattern 编译后的正则模式
|
|
|
- * @param content 被匹配的内容
|
|
|
+ *
|
|
|
+ * @param pattern 编译后的正则模式
|
|
|
+ * @param content 被匹配的内容
|
|
|
* @param withGroup0 是否包括分组0,此分组表示全匹配的信息
|
|
|
* @return 匹配后得到的字符串数组,按照分组顺序依次列出,未匹配到返回空列表,任何一个参数为null返回null
|
|
|
* @since 4.0.13
|
|
|
@@ -156,9 +167,9 @@ public class ReUtil {
|
|
|
* 从content中匹配出多个值并根据template生成新的字符串<br>
|
|
|
* 例如:<br>
|
|
|
* content 2013年5月 pattern (.*?)年(.*?)月 template: $1-$2 return 2013-5
|
|
|
- *
|
|
|
- * @param pattern 匹配正则
|
|
|
- * @param content 被匹配的内容
|
|
|
+ *
|
|
|
+ * @param pattern 匹配正则
|
|
|
+ * @param content 被匹配的内容
|
|
|
* @param template 生成内容模板,变量 $1 表示group1的内容,以此类推
|
|
|
* @return 新字符串
|
|
|
*/
|
|
|
@@ -189,9 +200,9 @@ public class ReUtil {
|
|
|
* 匹配结束后会删除匹配内容之前的内容(包括匹配内容)<br>
|
|
|
* 例如:<br>
|
|
|
* content 2013年5月 pattern (.*?)年(.*?)月 template: $1-$2 return 2013-5
|
|
|
- *
|
|
|
- * @param regex 匹配正则字符串
|
|
|
- * @param content 被匹配的内容
|
|
|
+ *
|
|
|
+ * @param regex 匹配正则字符串
|
|
|
+ * @param content 被匹配的内容
|
|
|
* @param template 生成内容模板,变量 $1 表示group1的内容,以此类推
|
|
|
* @return 按照template拼接后的字符串
|
|
|
*/
|
|
|
@@ -210,10 +221,10 @@ public class ReUtil {
|
|
|
* 匹配结束后会删除匹配内容之前的内容(包括匹配内容)<br>
|
|
|
* 例如:<br>
|
|
|
* content 2013年5月 pattern (.*?)年(.*?)月 template: $1-$2 return 2013-5
|
|
|
- *
|
|
|
- * @param pattern 匹配正则
|
|
|
+ *
|
|
|
+ * @param pattern 匹配正则
|
|
|
* @param contentHolder 被匹配的内容的Holder,value为内容正文,经过这个方法的原文将被去掉匹配之前的内容
|
|
|
- * @param template 生成内容模板,变量 $1 表示group1的内容,以此类推
|
|
|
+ * @param template 生成内容模板,变量 $1 表示group1的内容,以此类推
|
|
|
* @return 新字符串
|
|
|
*/
|
|
|
public static String extractMultiAndDelPre(Pattern pattern, Holder<CharSequence> contentHolder, String template) {
|
|
|
@@ -221,7 +232,7 @@ public class ReUtil {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- HashSet<String> varNums = findAll(PatternPool.GROUP_VAR, template, 1, new HashSet<String>());
|
|
|
+ HashSet<String> varNums = findAll(PatternPool.GROUP_VAR, template, 1, new HashSet<>());
|
|
|
|
|
|
final CharSequence content = contentHolder.get();
|
|
|
Matcher matcher = pattern.matcher(content);
|
|
|
@@ -240,10 +251,10 @@ public class ReUtil {
|
|
|
* 从content中匹配出多个值并根据template生成新的字符串<br>
|
|
|
* 例如:<br>
|
|
|
* content 2013年5月 pattern (.*?)年(.*?)月 template: $1-$2 return 2013-5
|
|
|
- *
|
|
|
- * @param regex 匹配正则字符串
|
|
|
+ *
|
|
|
+ * @param regex 匹配正则字符串
|
|
|
* @param contentHolder 被匹配的内容的Holder,value为内容正文,经过这个方法的原文将被去掉匹配之前的内容
|
|
|
- * @param template 生成内容模板,变量 $1 表示group1的内容,以此类推
|
|
|
+ * @param template 生成内容模板,变量 $1 表示group1的内容,以此类推
|
|
|
* @return 按照template拼接后的字符串
|
|
|
*/
|
|
|
public static String extractMultiAndDelPre(String regex, Holder<CharSequence> contentHolder, String template) {
|
|
|
@@ -258,8 +269,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 删除匹配的第一个内容
|
|
|
- *
|
|
|
- * @param regex 正则
|
|
|
+ *
|
|
|
+ * @param regex 正则
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 删除后剩余的内容
|
|
|
*/
|
|
|
@@ -275,7 +286,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 删除匹配的第一个内容
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 正则
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 删除后剩余的内容
|
|
|
@@ -290,8 +301,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 删除匹配的全部内容
|
|
|
- *
|
|
|
- * @param regex 正则
|
|
|
+ *
|
|
|
+ * @param regex 正则
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 删除后剩余的内容
|
|
|
*/
|
|
|
@@ -307,7 +318,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 删除匹配的全部内容
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 正则
|
|
|
* @param content 被匹配的内容
|
|
|
* @return 删除后剩余的内容
|
|
|
@@ -322,8 +333,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 删除正则匹配到的内容之前的字符 如果没有找到,则返回原文
|
|
|
- *
|
|
|
- * @param regex 定位正则
|
|
|
+ *
|
|
|
+ * @param regex 定位正则
|
|
|
* @param content 被查找的内容
|
|
|
* @return 删除前缀后的新内容
|
|
|
*/
|
|
|
@@ -343,8 +354,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果,获得匹配的所有结果中正则对应分组0的内容
|
|
|
- *
|
|
|
- * @param regex 正则
|
|
|
+ *
|
|
|
+ * @param regex 正则
|
|
|
* @param content 被查找的内容
|
|
|
* @return 结果列表
|
|
|
* @since 3.1.2
|
|
|
@@ -355,8 +366,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果,获得匹配的所有结果中正则对应分组1的内容
|
|
|
- *
|
|
|
- * @param regex 正则
|
|
|
+ *
|
|
|
+ * @param regex 正则
|
|
|
* @param content 被查找的内容
|
|
|
* @return 结果列表
|
|
|
* @since 3.1.2
|
|
|
@@ -367,24 +378,24 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果
|
|
|
- *
|
|
|
- * @param regex 正则
|
|
|
+ *
|
|
|
+ * @param regex 正则
|
|
|
* @param content 被查找的内容
|
|
|
- * @param group 正则的分组
|
|
|
+ * @param group 正则的分组
|
|
|
* @return 结果列表
|
|
|
* @since 3.0.6
|
|
|
*/
|
|
|
public static List<String> findAll(String regex, CharSequence content, int group) {
|
|
|
- return findAll(regex, content, group, new ArrayList<String>());
|
|
|
+ return findAll(regex, content, group, new ArrayList<>());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果
|
|
|
- *
|
|
|
- * @param <T> 集合类型
|
|
|
- * @param regex 正则
|
|
|
- * @param content 被查找的内容
|
|
|
- * @param group 正则的分组
|
|
|
+ *
|
|
|
+ * @param <T> 集合类型
|
|
|
+ * @param regex 正则
|
|
|
+ * @param content 被查找的内容
|
|
|
+ * @param group 正则的分组
|
|
|
* @param collection 返回的集合类型
|
|
|
* @return 结果集
|
|
|
*/
|
|
|
@@ -398,7 +409,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果,获得匹配的所有结果中正则对应分组0的内容
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被查找的内容
|
|
|
* @return 结果列表
|
|
|
@@ -410,7 +421,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果,获得匹配的所有结果中正则对应分组1的内容
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被查找的内容
|
|
|
* @return 结果列表
|
|
|
@@ -422,24 +433,24 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被查找的内容
|
|
|
- * @param group 正则的分组
|
|
|
+ * @param group 正则的分组
|
|
|
* @return 结果列表
|
|
|
* @since 3.0.6
|
|
|
*/
|
|
|
public static List<String> findAll(Pattern pattern, CharSequence content, int group) {
|
|
|
- return findAll(pattern, content, group, new ArrayList<String>());
|
|
|
+ return findAll(pattern, content, group, new ArrayList<>());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 取得内容中匹配的所有结果
|
|
|
- *
|
|
|
- * @param <T> 集合类型
|
|
|
- * @param pattern 编译后的正则模式
|
|
|
- * @param content 被查找的内容
|
|
|
- * @param group 正则的分组
|
|
|
+ *
|
|
|
+ * @param <T> 集合类型
|
|
|
+ * @param pattern 编译后的正则模式
|
|
|
+ * @param content 被查找的内容
|
|
|
+ * @param group 正则的分组
|
|
|
* @param collection 返回的集合类型
|
|
|
* @return 结果集
|
|
|
*/
|
|
|
@@ -461,8 +472,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 计算指定字符串中,匹配pattern的个数
|
|
|
- *
|
|
|
- * @param regex 正则表达式
|
|
|
+ *
|
|
|
+ * @param regex 正则表达式
|
|
|
* @param content 被查找的内容
|
|
|
* @return 匹配个数
|
|
|
*/
|
|
|
@@ -478,7 +489,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 计算指定字符串中,匹配pattern的个数
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被查找的内容
|
|
|
* @return 匹配个数
|
|
|
@@ -499,8 +510,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 指定内容中是否有表达式匹配的内容
|
|
|
- *
|
|
|
- * @param regex 正则表达式
|
|
|
+ *
|
|
|
+ * @param regex 正则表达式
|
|
|
* @param content 被查找的内容
|
|
|
* @return 指定内容中是否有表达式匹配的内容
|
|
|
* @since 3.3.1
|
|
|
@@ -516,7 +527,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 指定内容中是否有表达式匹配的内容
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 编译后的正则模式
|
|
|
* @param content 被查找的内容
|
|
|
* @return 指定内容中是否有表达式匹配的内容
|
|
|
@@ -531,7 +542,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 从字符串中获得第一个整数
|
|
|
- *
|
|
|
+ *
|
|
|
* @param StringWithNumber 带数字的字符串
|
|
|
* @return 整数
|
|
|
*/
|
|
|
@@ -541,8 +552,8 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 给定内容是否匹配正则
|
|
|
- *
|
|
|
- * @param regex 正则
|
|
|
+ *
|
|
|
+ * @param regex 正则
|
|
|
* @param content 内容
|
|
|
* @return 正则为null或者""则不检查,返回true,内容为null返回false
|
|
|
*/
|
|
|
@@ -564,7 +575,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 给定内容是否匹配正则
|
|
|
- *
|
|
|
+ *
|
|
|
* @param pattern 模式
|
|
|
* @param content 内容
|
|
|
* @return 正则为null或者""则不检查,返回true,内容为null返回false
|
|
|
@@ -580,18 +591,18 @@ public class ReUtil {
|
|
|
/**
|
|
|
* 正则替换指定值<br>
|
|
|
* 通过正则查找到字符串,然后把匹配到的字符串加入到replacementTemplate中,$1表示分组1的字符串
|
|
|
- *
|
|
|
+ *
|
|
|
* <p>
|
|
|
* 例如:原字符串是:中文1234,我想把1234换成(1234),则可以:
|
|
|
- *
|
|
|
+ *
|
|
|
* <pre>
|
|
|
* ReUtil.replaceAll("中文1234", "(\\d+)", "($1)"))
|
|
|
- *
|
|
|
+ *
|
|
|
* 结果:中文(1234)
|
|
|
* </pre>
|
|
|
- *
|
|
|
- * @param content 文本
|
|
|
- * @param regex 正则
|
|
|
+ *
|
|
|
+ * @param content 文本
|
|
|
+ * @param regex 正则
|
|
|
* @param replacementTemplate 替换的文本模板,可以使用$1类似的变量提取正则匹配出的内容
|
|
|
* @return 处理后的文本
|
|
|
*/
|
|
|
@@ -603,9 +614,9 @@ public class ReUtil {
|
|
|
/**
|
|
|
* 正则替换指定值<br>
|
|
|
* 通过正则查找到字符串,然后把匹配到的字符串加入到replacementTemplate中,$1表示分组1的字符串
|
|
|
- *
|
|
|
- * @param content 文本
|
|
|
- * @param pattern {@link Pattern}
|
|
|
+ *
|
|
|
+ * @param content 文本
|
|
|
+ * @param pattern {@link Pattern}
|
|
|
* @param replacementTemplate 替换的文本模板,可以使用$1类似的变量提取正则匹配出的内容
|
|
|
* @return 处理后的文本
|
|
|
* @since 3.0.4
|
|
|
@@ -618,7 +629,7 @@ public class ReUtil {
|
|
|
final Matcher matcher = pattern.matcher(content);
|
|
|
boolean result = matcher.find();
|
|
|
if (result) {
|
|
|
- final Set<String> varNums = findAll(PatternPool.GROUP_VAR, replacementTemplate, 1, new HashSet<String>());
|
|
|
+ final Set<String> varNums = findAll(PatternPool.GROUP_VAR, replacementTemplate, 1, new HashSet<>());
|
|
|
final StringBuffer sb = new StringBuffer();
|
|
|
do {
|
|
|
String replacement = replacementTemplate;
|
|
|
@@ -634,12 +645,12 @@ public class ReUtil {
|
|
|
}
|
|
|
return StrUtil.str(content);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 替换所有正则匹配的文本,并使用自定义函数决定如何替换
|
|
|
- *
|
|
|
- * @param str 要替换的字符串
|
|
|
- * @param regex 用于匹配的正则式
|
|
|
+ *
|
|
|
+ * @param str 要替换的字符串
|
|
|
+ * @param regex 用于匹配的正则式
|
|
|
* @param replaceFun 决定如何替换的函数
|
|
|
* @return 替换后的文本
|
|
|
* @since 4.2.2
|
|
|
@@ -647,17 +658,17 @@ public class ReUtil {
|
|
|
public static String replaceAll(CharSequence str, String regex, Func1<Matcher, String> replaceFun) {
|
|
|
return replaceAll(str, Pattern.compile(regex), replaceFun);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 替换所有正则匹配的文本,并使用自定义函数决定如何替换
|
|
|
- *
|
|
|
- * @param str 要替换的字符串
|
|
|
- * @param pattern 用于匹配的正则式
|
|
|
+ *
|
|
|
+ * @param str 要替换的字符串
|
|
|
+ * @param pattern 用于匹配的正则式
|
|
|
* @param replaceFun 决定如何替换的函数,可能被多次调用(当有多个匹配时)
|
|
|
* @return 替换后的字符串
|
|
|
* @since 4.2.2
|
|
|
*/
|
|
|
- public static String replaceAll(CharSequence str, Pattern pattern, Func1<Matcher, String> replaceFun){
|
|
|
+ public static String replaceAll(CharSequence str, Pattern pattern, Func1<Matcher, String> replaceFun) {
|
|
|
if (StrUtil.isEmpty(str)) {
|
|
|
return StrUtil.str(str);
|
|
|
}
|
|
|
@@ -677,7 +688,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 转义字符,将正则的关键字转义
|
|
|
- *
|
|
|
+ *
|
|
|
* @param c 字符
|
|
|
* @return 转义后的文本
|
|
|
*/
|
|
|
@@ -692,7 +703,7 @@ public class ReUtil {
|
|
|
|
|
|
/**
|
|
|
* 转义字符串,将正则的关键字转义
|
|
|
- *
|
|
|
+ *
|
|
|
* @param content 文本
|
|
|
* @return 转义后的文本
|
|
|
*/
|