Java 正在操作工具类

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * java 正则匹配基本操作工具类
 * <p>
 * 参考:https://www.cnblogs.com/Krloypower/p/11356805.html
 *
 * @description:
 * @author: mabh
 * @create: 2021/5/6 14:09
 **/
public final class RegexUtils {
    /**
     * 缓存一些 Pattern.compile() 的
     */
    private static final Map<String, Pattern> PATTERN = new HashMap<>();

    private RegexUtils() {
    }

    /**
     * 获取匹配项
     *
     * @param regex
     * @param input
     * @return 返回一个list集合类型的匹配项
     * @see #getMatcherList(String, CharSequence, int)
     */
    public static List<String> getMatcherList(String regex, CharSequence input) {
        return getMatcherList(regex, input, 0);
    }

    /**
     * 获取匹配项
     *
     * @param regex
     * @param input
     * @param group //group(0) 返回符合条件的字符串,  group(1) 表示正则表达式中符合条件的字符串中的第一个() 中的字符串。
     * @return 返回一个list集合类型的匹配项
     * @see #getMatcherList(String, CharSequence)
     */
    public static List<String> getMatcherList(String regex, CharSequence input, int group) {
        List<String> list = new ArrayList<>();
        forEach(regex, input, matcher -> list.add(matcher.group(group)));
        return list;
    }

    /**
     * 迭代匹配,更*的操作,一般无需直接操作改方法,除非你有更复杂的场景。
     *
     * @param regex
     * @param input
     * @param consumer
     * @see #getMatcherList(String, CharSequence, int)
     * @see #findAny(String, CharSequence)
     */
    public static void forEach(String regex, CharSequence input, Consumer<Matcher> consumer) {
        Pattern compile = getCompile(regex);
        Matcher matcher = compile.matcher(input);
        while (matcher.find()) {
            consumer.accept(matcher);
        }
    }

    /**
     * 非贪婪模式匹配,是否有匹配项
     *
     * @param regex
     * @param input
     * @return true,存在指定规则的匹配数据
     */
    public static boolean findAny(String regex, CharSequence input) {
        //默认贪婪是匹配,如果仅仅查询是否有匹配项,直接是否非贪婪即可,性能更好,哪怕这种性能微乎其微
        Pattern p = getCompile("^" + regex);
        Matcher m = p.matcher(input);
        return m.find();
    }

    /**
     * 是否匹配
     *
     * @param regex
     * @param input
     * @return
     */
    public static boolean matches(String regex, CharSequence input) {
        Pattern compile = getCompile(regex);
        Matcher matcher = compile.matcher(input);
        return matcher.matches();
    }

    /**
     * 优先会找缓存,找不到再初始化
     *
     * @param regex 标准的正则表达式
     * @return
     */
    private static Pattern getCompile(String regex) {
        Pattern compile = PATTERN.getOrDefault(regex, Pattern.compile(regex));
        PATTERN.put(regex, compile);
        return compile;
    }
}

上一篇:Linux基本命令 和 Regex 正则表达式


下一篇:java中正则表达式的group用法