update 优化正则编译,放入模式池工厂,不用每次调用都编译一次

2.X
21001 1 year ago
parent cba2537db7
commit 79b583b5ab

@ -1,85 +1,49 @@
package org.dromara.common.core.constant;
import cn.hutool.core.lang.RegexPool;
/**
*
*
* <p>
* : https://any86.github.io/any-rule/
*
* @author Feng
*/
public interface RegexConstants {
/**
*
*/
public static final String CHINESE_REGEX = "[\\u4e00-\\u9fa5]+";
/**
* 2-4
*/
public static final String NAME_REGEX = "^[\u4e00-\u9fa5]{2,4}$";
public interface RegexConstants extends RegexPool {
/**
*
*/
public static final String PHONE_NUMBER_REGEX = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";
/**
*
*/
public static final String LANDLINE_REGEX = "^(0\\d{2,3})-?(\\d{7,8})$";
/**
*
*/
public static final String EMAIL_REGEX = "^[\\w+&*-]+(?:\\.[\\w+&*-]+)*@(?:[\\w+&*-]+\\.)+[a-zA-Z]{2,7}$";
/**
*
*/
public static final String ID_CARD_REGEX_GENERAL = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)";
/**
* - 18
*/
public static final String ID_CARD_REGEX_ACCURATE_18 = "^[1-9]\\d{5}(19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
/**
* 15
* 线
*/
public static final String ID_CARD_REGEX_ACCURATE_15 = "^[1-9]\\d{5}\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{2}[0-9Xx]$";
public static final String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$";
/**
* 6
*/
public static final String ID_CARD_REGEX_LAST_6 = "^(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
public static final String ID_CARD_LAST_6 = "^(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
/**
* QQ
*/
public static final String QQ_NUMBER_REGEX = "^[1-9][0-9]\\d{4,9}$";
public static final String QQ_NUMBER = "^[1-9][0-9]\\d{4,9}$";
/**
*
*/
public static final String POSTAL_CODE_REGEX = "^[1-9]\\d{5}$";
public static final String POSTAL_CODE = "^[1-9]\\d{5}$";
/**
*
*/
public static final String ACCOUNT_REGEX = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
public static final String ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
/**
* 8
*/
public static final String PASSWORD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";
public static final String PASSWORD = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";
/**
* 01
*/
public static final String STATUS_REGEX = "^[01]$";
/**
* 线
*/
public static final String DICTIONARY_TYPE_REGEX = "^[a-z][a-z0-9_]*$";
public static final String STATUS = "^[01]$";
}

@ -0,0 +1,52 @@
package org.dromara.common.core.factory;
import cn.hutool.core.lang.PatternPool;
import org.dromara.common.core.constant.RegexConstants;
import java.util.regex.Pattern;
/**
*
* <p></p>
* <p></p>
*
* @author 21001
*/
public class RegexPatternPoolFactory extends PatternPool {
/**
* 线
*/
public static final Pattern DICTIONARY_TYPE = get(RegexConstants.DICTIONARY_TYPE);
/**
* 6
*/
public static final Pattern ID_CARD_LAST_6 = get(RegexConstants.ID_CARD_LAST_6);
/**
* QQ
*/
public static final Pattern QQ_NUMBER = get(RegexConstants.QQ_NUMBER);
/**
*
*/
public static final Pattern POSTAL_CODE = get(RegexConstants.POSTAL_CODE);
/**
*
*/
public static final Pattern ACCOUNT = get(RegexConstants.ACCOUNT);
/**
* 8
*/
public static final Pattern PASSWORD = get(RegexConstants.PASSWORD);
/**
* 01
*/
public static final Pattern STATUS = get(RegexConstants.STATUS);
}

@ -1,227 +0,0 @@
package org.dromara.common.core.utils;
import cn.hutool.core.convert.Convert;
import org.dromara.common.core.constant.RegexConstants;
import org.dromara.common.core.exception.ServiceException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
*
* @author Feng
*/
public class ReUtil {
public final static Pattern GROUP_VAR = Pattern.compile("\\$(\\d+)");
/**
*
*/
public final static Set<Character> RE_KEYS = new HashSet<>(Arrays.asList('$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'));
/**
*
*
* @param input
* @param regex 使 {@link RegexConstants}
* @return true false
* @throws IllegalArgumentException null
*/
public static boolean isValid(String input, String regex) {
// 检查输入参数是否为null如果是则抛出IllegalArgumentException
if (StringUtils.isEmpty(input) || StringUtils.isEmpty(regex)) {
throw new ServiceException("输入和正则表达式不得为空");
}
// 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 创建匹配器对象,并将输入字符串与正则表达式进行匹配
Matcher matcher = pattern.matcher(input);
// 返回匹配结果
return matcher.matches();
}
/**
*
*
* @param input
* @param regex 使 {@link RegexConstants}
* @return
*/
public static String extractFromString(String input, String regex) {
// 检查输入参数是否为null如果是则抛出IllegalArgumentException
if (StringUtils.isEmpty(input) || StringUtils.isEmpty(regex)) {
throw new ServiceException("输入和正则表达式不得为空");
}
// 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 查找匹配
if (matcher.find()) {
// 获取匹配的部分
return matcher.group(1);
} else {
// 如果没有匹配,返回原始字符串
return input;
}
}
/**
*
*
* @param input
* @param regex 使 {@link RegexConstants}
* @param defaultInput
* @return
*/
public static String extractFromString(String input, String regex, String defaultInput) {
// 检查输入参数是否为null如果是则抛出IllegalArgumentException
if (StringUtils.isEmpty(input) || StringUtils.isEmpty(regex)) {
throw new ServiceException("输入和正则表达式不得为空");
}
// 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 查找匹配
if (matcher.find()) {
// 获取匹配的部分
return matcher.group(1);
} else {
// 如果没有匹配,返回默认值
return defaultInput;
}
}
/**
* <br>
* replacementTemplate$11
*
* <p>
* 12341234(1234)
*
* <pre>
* ReUtil.replaceAll("中文1234", "(\\d+)", "($1)"))
*
* (1234)
* </pre>
*
* @param content
* @param regex
* @param replacementTemplate 使$1
* @return
*/
public static String replaceAll(CharSequence content, String regex, String replacementTemplate) {
final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
return replaceAll(content, pattern, replacementTemplate);
}
/**
* <br>
* replacementTemplate$11
*
* @param content
* @param pattern {@link Pattern}
* @param replacementTemplate 使$1
* @return
* @since 3.0.4
*/
public static String replaceAll(CharSequence content, Pattern pattern, String replacementTemplate) {
if (StringUtils.isEmpty(content)) {
return StringUtils.EMPTY;
}
final Matcher matcher = pattern.matcher(content);
boolean result = matcher.find();
if (result) {
final Set<String> varNums = findAll(GROUP_VAR, replacementTemplate, 1, new HashSet<>());
final StringBuffer sb = new StringBuffer();
do {
String replacement = replacementTemplate;
for (String var : varNums) {
int group = Integer.parseInt(var);
replacement = replacement.replace("$" + var, matcher.group(group));
}
matcher.appendReplacement(sb, escape(replacement));
result = matcher.find();
}
while (result);
matcher.appendTail(sb);
return sb.toString();
}
return Convert.toStr(content);
}
/**
*
*
* @param <T>
* @param pattern
* @param content
* @param group
* @param collection
* @return
*/
public static <T extends Collection<String>> T findAll(Pattern pattern, CharSequence content, int group,
T collection) {
if (null == pattern || null == content) {
return null;
}
if (null == collection) {
throw new NullPointerException("Null collection param provided!");
}
final Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
collection.add(matcher.group(group));
}
return collection;
}
/**
*
*
* @param c
* @return
*/
public static String escape(char c) {
final StringBuilder builder = new StringBuilder();
if (RE_KEYS.contains(c)) {
builder.append('\\');
}
builder.append(c);
return builder.toString();
}
/**
*
*
* @param content
* @return
*/
public static String escape(CharSequence content) {
if (StringUtils.isBlank(content)) {
return StringUtils.EMPTY;
}
final StringBuilder builder = new StringBuilder();
int len = content.length();
char current;
for (int i = 0; i < len; i++) {
current = content.charAt(i);
if (RE_KEYS.contains(current)) {
builder.append('\\');
}
builder.append(current);
}
return builder.toString();
}
}

@ -0,0 +1,30 @@
package org.dromara.common.core.utils.regex;
import cn.hutool.core.util.ReUtil;
import org.dromara.common.core.constant.RegexConstants;
/**
*
*
* @author Feng
*/
public final class RegexUtils extends ReUtil {
/**
*
*
* @param input
* @param regex 使 {@link RegexConstants}
* @param defaultInput
* @return
*/
public static String extractFromString(String input, String regex, String defaultInput) {
try {
return ReUtil.get(regex, input, 1);
} catch (Exception e) {
return defaultInput;
}
}
}

@ -0,0 +1,105 @@
package org.dromara.common.core.utils.regex;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.lang.Validator;
import org.dromara.common.core.factory.RegexPatternPoolFactory;
import java.util.regex.Pattern;
/**
*
*
*
* @author Feng
*/
public class RegexValidator extends Validator {
/**
* 线
*/
public static final Pattern DICTIONARY_TYPE = RegexPatternPoolFactory.DICTIONARY_TYPE;
/**
* 6
*/
public static final Pattern ID_CARD_LAST_6 = RegexPatternPoolFactory.ID_CARD_LAST_6;
/**
* QQ
*/
public static final Pattern QQ_NUMBER = RegexPatternPoolFactory.QQ_NUMBER;
/**
*
*/
public static final Pattern POSTAL_CODE = RegexPatternPoolFactory.POSTAL_CODE;
/**
*
*/
public static final Pattern ACCOUNT = RegexPatternPoolFactory.ACCOUNT;
/**
* 8
*/
public static final Pattern PASSWORD = RegexPatternPoolFactory.PASSWORD;
/**
* 01
*/
public static final Pattern STATUS = RegexPatternPoolFactory.STATUS;
/**
*
*
* @param value
* @return true false
*/
public static boolean isAccount(CharSequence value) {
return isMatchRegex(ACCOUNT, value);
}
/**
* ValidateException
*
* @param value
* @param errorMsg
* @param <T> CharSequence
* @return
* @throws ValidateException
*/
public static <T extends CharSequence> T validateAccount(T value, String errorMsg) throws ValidateException {
if (!isAccount(value)) {
throw new ValidateException(errorMsg);
}
return value;
}
/**
*
*
* @param value
* @return true false
*/
public static boolean isStatus(CharSequence value) {
return isMatchRegex(STATUS, value);
}
/**
* ValidateException
*
* @param value
* @param errorMsg
* @param <T> CharSequence
* @return
* @throws ValidateException
*/
public static <T extends CharSequence> T validateStatus(T value, String errorMsg) throws ValidateException {
if (!isStatus(value)) {
throw new ValidateException(errorMsg);
}
return value;
}
}

@ -42,7 +42,7 @@ public class SysDictTypeBo extends BaseEntity {
*/
@NotBlank(message = "字典类型不能为空", groups = { AddGroup.class, EditGroup.class })
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符")
@Pattern(regexp = RegexConstants.DICTIONARY_TYPE_REGEX, message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
@Pattern(regexp = RegexConstants.DICTIONARY_TYPE, message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
private String dictType;
/**

Loading…
Cancel
Save