JAVA工具类匹配重复或者连续的字符和符号

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class StringChecker {
    static String SYMBOLS = "~!@#$%^&*()_+{}|<>?,./";
    static List<String> symbolSubstrings = splitStringIntoSubstrings(SYMBOLS, 3);

    /**
     * 检查字符串是否包含重复或递增的字符
     *
     * @param str 要检查的字符串
     * @return 如果字符串包含重复或递增的字符,则返回true;否则返回false
     */
    public static boolean containsRepeatingOrIncrementalChars(String str) {
        int length = str.length();
        if (length < 3) {
            return false;
        }
        int[] asciiArray = convertToAsciiArray(str);

        for (int i = 0; i < asciiArray.length; i++) {
            if (i >= asciiArray.length - 2) {
                break;
            }
            int current = asciiArray[i];
            int next = asciiArray[i + 1];
            int afterNext = asciiArray[i + 2];
            // 校验重复或递增的数字或字母
            if ((next == current + 1 && afterNext == next + 1) || (current == next && next == afterNext)) {
                return true;
            }
        }

        for (String symbol : symbolSubstrings) {
            if (str.contains(symbol)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 将字符串按指定长度拆分成子串
     *
     * @param str             要拆分的字符串
     * @param substringLength 子串的长度
     * @return 拆分后的子串列表
     */
    public static List<String> splitStringIntoSubstrings(String str, int substringLength) {
        List<String> substrings = new ArrayList<>();

        for (int i = 0; i < str.length(); i++) {
            if (i + substringLength > str.length()) {
                break;
            }
            int endIndex = Math.min(i + substringLength, str.length());
            String substring = str.substring(i, endIndex);
            substrings.add(substring);
        }

        return substrings;
    }

    /**
     * 将字符串转换为ASCII码数组
     *
     * @param str 要转换的字符串
     * @return ASCII码数组
     */
    public static int[] convertToAsciiArray(String str) {
        int[] asciiArray = new int[str.length()];

        for (int i = 0; i < str.length(); i++) {
            asciiArray[i] = (int) str.charAt(i);
        }

        return asciiArray;
    }

    public static void main(String[] args) {
        System.out.println(containsRepeatingOrIncrementalChars("abc3132132"));    // true
        System.out.println(containsRepeatingOrIncrementalChars("123fasfadfas")); // true
        System.out.println(containsRepeatingOrIncrementalChars("!@#dfafa"));      // true
        System.out.println(containsRepeatingOrIncrementalChars("aabc"));          // true
        System.out.println(containsRepeatingOrIncrementalChars("fas12@##"));      // false
    }
}
相关推荐
要开心吖ZSH5 小时前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
-银雾鸢尾-8 小时前
C#中的拓展方法
开发语言·c#
guodingdingh10 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯11 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育12 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵12 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔13 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel13 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影14 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
CCPC不拿奖不改名14 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github