java 正则表达式总结

news2024/11/18 16:22:52

目录

一、简介

二、源码分析

        1.简单实例 : 

        2.底层实现 : 

                1° fund()方法

                2° group(0/1)方法

                        (1)group(0): 

                        (2)group(1):

三、 基本语法

        1.元字符介绍 : 

        2.元字符—字符匹配符 : 

                Δ代码演示

        3.关于字母大小写问题 : 

                Δ代码演示

        4.元字符—定位符 : 

                1° 定义

                2° 常用定位符

                3° 代码演示

四、分组

        1.捕获分组 : 

                1° 非命名捕获

                2° 命名捕获

                3° 代码演示

        2.非捕获分组 : 

                1° 分类 

                2° 演示 

五、常用类

        1.Pattern : 

                1° 简介 

                2° 常用方法 

        2.Matcher : 

                1° 简介 

                2° 常用方法

        3.PatternSyntaxException : 

                1° 简介

六、反向引用

        1.定义 : 

        2.反向引用实例 : 

        3.结巴去重实例 : 

七、总结


一、简介

        正则表达式,全称Regular Expression,有时简写为regexp,RegExp或RE。正则表达式是java提供的一种用于处理文本相关问题的技术(目前很多编程语言都支持正则表达式,且语法规则类似),它通过简单字符串对“指定格式”的描述,来匹配全文中满足该格式的字符串。简单来说,正则表达式就是对字符串执行模式匹配的技术,一个正则表达式就是用某种模式去匹配字符串的一个公式


二、源码分析

        1.简单实例 : 

                现有一段文字如下: 

        DBUtils中常用的类和接口如下——

        1111.QueryRunner类 : 该类封装了SQL的执行,并且是线程安全的;可以实现增删查改,并且支持批处理。

        2222.ResultSetHandler接口 : 该接口用于处理java.sql.ResultSet,将数据按照要求转换为另一种格式。常见实现类如下 :         

        3333.ArrayHandler : 将结果集中的第一行数据转换成对象数组。

        4444.ArrayListHandler : 将结果集中的每一行数据转换成对象数组,再存入List中。

        5555.BeanHandler : 将结果集中的第一行数据封装到一个对应的JavaBean实例中(适用于返回单条记录的情况)。

        6666.BeanListHandler : 将结果集中的每一行数据都封装到对应的JavaBean实例中,再存放到List集合中。

        7777.ColumnListHandler : 将结果集中某一列的数据存放到List中。

        8888.KeyedHandler(name) : 将结果集中的每行数据都封装到Map里,然后将所有的map再单独存放到一个map中,其key为指定的key。

        9999.MapHandler : 将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

        1010.1010.MapListHandler : 将结果集中的每一行数据都封装到Map里,再存入List。

        1111.1111.ScalarHandler : 将结果集中的一列映射为一个Object对象,适用于返回单行单列的情况。

                现要求用Java程序,找出这段文字中的四位数字
                使用正则表达式实现,以RegExp_Demo1类为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class RegExp_Demo1 {
    public static void main(String[] args) {
        //需要操作的内容如下 :
        String text =
                "DBUtils中常用的类和接口如下——\n" +
            "1111.QueryRunner类 : 该类封装了SQL的执行,并且是线程安全的;可以实现增删查改,并且支持批处理。\n" +
            "\n" +
            "2222.ResultSetHandler接口 : 该接口用于处理java.sql.ResultSet,将数据按照要求转换为另一种格式。常见实现类如下 :         \n" +
            "\n" +
            "3333.ArrayHandler : 将结果集中的第一行数据转换成对象数组。\n" +
            "\n" +
            "4444.ArrayListHandler : 将结果集中的每一行数据转换成对象数组,再存入List中。\n" +
            "\n" +
            "5555.BeanHandler : 将结果集中的第一行数据封装到一个对应的JavaBean实例中(适用于返回单条记录的情况)。\n" +
            "\n" +
            "6666.BeanListHandler : 将结果集中的每一行数据都封装到对应的JavaBean实例中,再存放到List集合中。\n" +
            "\n" +
            "7777.ColumnListHandler : 将结果集中某一列的数据存放到List中。\n" +
            "\n" +
            "8888.KeyedHandler(name) : 将结果集中的每行数据都封装到Map里,然后将所有的map再单独存放到一个map中,其key为指定的key。\n" +
            "\n" +
            "9999.MapHandler : 将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。\n" +
            "\n" +
            "1010.1010.MapListHandler : 将结果集中的每一行数据都封装到Map里,再存入List。\n" +
            "\n" +
            "1111.1111.ScalarHandler : 将结果集中的一列映射为一个Object对象,适用于返回单行单列的情况。";

        //1.指定匹配格式  (PS : \\d表示0~9的一个任意数字)
        String regStr = "\\d\\d\\d\\d";

        //2.创建一个模式对象  (一个正则表达式对象)
        Pattern pattern = Pattern.compile(regStr);

        //3.获取对应的匹配器
        Matcher matcher = pattern.matcher(text);

        //4.进行匹配
        //find方法返回boolean类型; group方法获取字符串
        while (matcher.find()) {
            System.out.println("GET —— " + matcher.group(0));
        }
    }
}

                运行结果 : 

        2.底层实现 : 

                1° fund()方法

                1>根据指定的规则,定位满足规则的子字符串;
                2>找到后,将子字符串的开始索引记录到matcher对象的int[] groups属性中,即groups[0],如下图所示 : 

                以文本中第一个四位数1111为例,即groups[0] = 20; 接着,将子字符串结束的(索引值 + 1)记录到groups[1]中。如下图所示 : 

                同时,还会将该子字符串结束的(索引值 + 1)用oldLast变量来保存,如下图所示 : 

                oldLast默认值为1. 

                当下次执行find方法时,就会从oldLast变量保存的索引值( = 上一次匹配结果的末尾索引值 + 1)开始匹配。 

                2° group(0/1)方法

                        (1)group(0): 

                 group方法源码如下 : 

                first和last分别表示上一次匹配到的子字符串的(首索引)和(尾索引 + 1) 。

                若传入的group = 0,则groups[0 * 2]~groups[0*2 + 1] = groups[0]~groups[1]。
                Δ最终返回的就是find方法捕获到的子字符串, getSubSequence方法底层调用了subString方法(前闭后开)
                当下一次执行find方法后,就会用匹配到的新值覆盖groups[0]和groups[1],如下图所示: 

                        (2)group(1):

                PS : 若将匹配格式由"\\d\\d\\d\\d"改为"(\\d\\d)(\\d\\d)",则表示分组;第一个()表示第一组,第二个()表示第二组,以此类推
                以"(\\d\\d)(\\d\\d)"分组为例,find方法在找到匹配的子字符串后,仍然会将该子字符串的(首索引值)和(尾索引值 + 1)分别保存在groups数组的group[0]和group[1]中。
                但是,由于进行了分组,会继续在groups数组中保存分组的信息,groups[2]和groups[3]保存第一组的信息(与groups[0],groups[1]同理);groups[4]和groups[5]保存第二组的信息,以此类推
                因此,当传入1时,group(1)表示获取第一组的内容;当传入2时,group(2)表示获取第二组的内容,以此类推。注意 : 传入的group实参不能越界
                如下图所示 : 

                尝试输入子字符串的不同分组 :  

                运行结果 :  


三、 基本语法

        1.元字符介绍 : 

        元字符指正则表达式中具有特殊意义的字符。元字符从功能上大致分为六类,分别是限定符;选择匹配符;分组组合和反向引用符;特殊字符;字符匹配符;定位符

        PS : 使用正则表达式去检索某些特殊字符时,需要用到转义符号,否则检索不到结果,甚至报错。在Java的RegExp中,\\代表其他语言的一个\,表示转义符号常见的需要用到转义符号的元字符有:.,*,+,(,),$,/,\,?,[,],^,{,}

        2.元字符—字符匹配符 : 

符号含义实例解释
[]可接收的字符列表[yurisa]y,u,r,i,s,a中任意一个字符都可以
[^]不接收的字符列表[^slack]除s,l,a,c,k外的任意一个字符,包括数字和特殊字符
-连字符A-Z任意的单个大写字母
.匹配除\n以外的任意字符a..b以a开头,以b结尾,中间包含两个任意非\n字符的长度为4的字符串
|选择匹配符[a|b|c]满足a,b,c中的任意一个即可
\\d匹配单个数字字符,相当于[0-9]\\d{3}(\\d)?包含3个或4个数字的字符串;?表示(\\d)可能为0次或1次(正则限定符?,*,+,{})
\\D匹配单个非数字字符,相当于[^0-9]\\D(\\d)*以单个非数字字符开头,后接任意个数字的字符串;*表示0次或多次
\\w匹配单个数字或大小写字母字符或下划线,相当于[0-9a-zA-Z]

\\d{3}\\w{4}

以3个数字字符开头,长度为7的数字字母字符串
\\W匹配单个非数字,非大小写字母,非下划线字符,相当于[^0-9a-zA-Z]\\W+\\d{2}以至少一个非数字字母字符开头,两个数字字符结尾的字符串;+表示1~多次
\\s匹配任何空白字符(空格,制表符等)\\s+匹配至少连续一个空白字符
\\S匹配任何非空白字符;与\\s相反\\S{3}匹配连续的三个非空白字符;{n}表示匹配确定数量的字符;{n,}表示匹配≥n的数量的字符;{n,m}表示匹配[n,m]数量的字符

                PS : (1) java正则表达式默认贪婪匹配——即尽可能匹配更多的字符;若想使用非贪婪匹配,可以在+,*,{n}等元字符后加?,eg : \\d?。
                        (2) 若[]中出现?,表示匹配一个真正的?,等价于\\?。(*,+,.同样适用)

                Δ代码演示

                以RegExp_Demo2类为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class RegExp_Demo2 {
    public static void main(String[] args) {
        String context = "I have $233RA9BB apples and one of those apples is #666hhh$.";

        //1.指定匹配格式
        String regStr = "\\W+\\d{3}\\w{3}[A-B]*(\\W)?";

        //2.创建模式对象
        Pattern pattern = Pattern.compile(regStr);

        //3.获取对应的匹配器(传入要检索的内容)
        Matcher matcher = pattern.matcher(context);

        //4.进行匹配
        while (matcher.find()) {
            System.out.println("Get —— " + matcher.group(0));
        }
    }
}

                运行结果 : 

        3.关于字母大小写问题 : 

        Java正则表达式默认会区分字母的大小写实现"不区分字母大小写"的方式如下——

        (?i)abcd : 表示abcd均不区分大小写;

        a(?i)bcd : 表示bcd均不区分大小写;

        a((?i)b)cd : 表示仅有b不区分字母大小写;

        在获取Pattern对象的compile方法中,追加Pattern.CASE_INSENSITIVE参数
        eg : 

        Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);

                Δ代码演示

                以RegExp_Demo3类为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExp_Demo3 {
    public static void main(String[] args) {
        String context = "My hobby is ABCDEabcde, abcdeABCDE, fGG and FGG";

        //1.指定匹配格式
        String regStr = "(?i)[a-e]{5}";
        String regStr_EX = "(?i)fGG";
        String regStr_pro = "abcde";

        //2.创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        Pattern pattern_EX = Pattern.compile(regStr_EX);
        Pattern pattern_pro = Pattern.compile(regStr_pro, Pattern.CASE_INSENSITIVE);

        //3.获取对应的匹配器
        Matcher matcher = pattern.matcher(context);
        Matcher matcher_EX = pattern_EX.matcher(context);
        Matcher matcher_pro = pattern_pro.matcher(context);

        //4.开始匹配
        while (matcher.find()) {
            System.out.println(matcher.group(0));
        }
        System.out.println("======================================");

        while (matcher_EX.find()) {
            System.out.println(matcher_EX.group(0));
        }
        System.out.println("======================================");

        while (matcher_pro.find()) {
            System.out.println(matcher_pro.group(0));
        }
    }
}

                运行结果 : 

        4.元字符—定位符 : 

                1° 定义

        定位符,用于规定要匹配的字符串出现的位置;比如在字符串的开始还是结束的位置。

                2° 常用定位符

符号含义实例解释
^指定要检索内容的起始字符^[0-9]+[a-z]*匹配以至少一个数字开头,后接任意个小写字母的字符串
$指定要检索内容的结束字符^[0-9]//-[A-Z]+$匹配以一个数字开头,后接一个连字符-,以任意个大写字母结束的字符串
\\b匹配符合指定格式,又处于边界位置的字符串\\W\\b所谓边界位置,即该子字符串之后是空格或结束位置
\\B匹配符合指定格式,但处于非边界位置的字符串\\W\\B非边界位置,即与\\b相反

                3° 代码演示

                以RegExp_Demo4类为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class RegExp_Demo4 {
    public static void main(String args[]) {
        String context = "A-140-#";
        String context_EX = "Cyan_RA9_CSDN Cyan_Ra9 Cyan_RA9";

        //1.指定匹配格式
        String regStr = "^[ABC]\\-\\d{3}\\-\\W$";
        String regStr_EX = "(Cyan_R((?i)A)9)\\b";   //\\b匹配2个; \\B匹配1个(第一个)

        //2.创建模式对象
        Pattern pattern = Pattern.compile(regStr);
        Pattern pattern_EX = Pattern.compile(regStr_EX);

        //3.获取对应的匹配器对象
        Matcher matcher = pattern.matcher(context);
        Matcher matcher_EX = pattern_EX.matcher(context_EX);

        //4.进行匹配
        while (matcher.find()) {
            System.out.println("Matched : " + matcher.group(0));
        }
        System.out.println("-------------------------");

        while (matcher_EX.find()) {
            System.out.println("Matched : " + matcher_EX.group(0));
        }
    }
}

                运行结果 : 


四、分组

        1.捕获分组 : 

                1° 非命名捕获

        (pattern),非命名捕获,捕获匹配的字符串。编号为0的第一个捕获是由整个正则表达式模式匹配的文本,即group(0);其他捕获结果则根据左括号的顺序从1开始自动编号,即group(1), group(2)...等。

                2° 命名捕获

        (?<name>pattern),命名捕获。将匹配到的子字符串捕获到一个组名称或编号名称中获取捕获到的内容时,既可以通过数字编号,也可以通过定义的名称

                3° 代码演示

                以RegExp_Demo5类为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.sql.SQLOutput;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class RegExp_Demo5 {
    public static void main(String[] args) {
        String context = "I have 1314 apples, I have 4204 pens.";

        //1.指定匹配格式
        String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";

        //2.创建模式对象
        Pattern pattern = Pattern.compile(regStr);

        //3.获取对应的匹配器对象
        Matcher matcher = pattern.matcher(context);

        //4.开始匹配
        while (matcher.find()) {
            System.out.println("整体的捕获结果 = " + matcher.group(0));
            System.out.println("first group by number = " + matcher.group(1));
            System.out.println("first group by name = " + matcher.group("g1"));
            System.out.println();
            System.out.println("second group by number = " + matcher.group(2));
            System.out.println("second group by name = " + matcher.group("g2"));
            System.out.println("===========================\n");
        }
    }
}

                运行结果 : 

        2.非捕获分组 : 

                1° 分类 

形式说明
(?:pattern)

匹配符合pattern的子字符串,但不进行捕获;适用于"or"字符(|)组合模式部件的情况。(强调整体)

eg : "Cyan_RA9|Cyan_EX|Cyan_Pro" ---> "Cyan_(?:RA9|EX|Pro)"

(?=pattern)非捕获匹配;与(?:pattern)不同的是,(?=pattern)只匹配满足特定条件的主体本身,而不包含条件中的内容。
(?!pattern)非捕获匹配;匹配不符合pattern的起始点的搜索字符串。与(?=pattern)相反。

                2° 演示 

                以RegExp_Demo6为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class RegExp_Demo6 {
    public static void main(String[] args) {
        String context_0 = "Cyan_RA9 Cyan_EX Cyan_Pro";
        String context_1 = "Cyan_RA9 CSDN, Cyan_RA9 AliCloud, Cyan_RA9 HuaweiCloud";
        String context_2 = "Cyan_RA9 Cyan_EX Cyan_Pro";

        String regStr_0  = "Cyan_(?:RA9|EX|Pro)";
        String regStr_1  = "Cyan_RA9(?= CSDN| AliCloud)";
        String regStr_2  = "Cyan_RA9(?! CSDN| AliCloud)";

        Pattern pattern_0 = Pattern.compile(regStr_0);
        Pattern pattern_1 = Pattern.compile(regStr_1);
        Pattern pattern_2 = Pattern.compile(regStr_2);

        Matcher matcher_0 = pattern_0.matcher(context_0);
        Matcher matcher_1 = pattern_1.matcher(context_1);
        Matcher matcher_2 = pattern_2.matcher(context_2);

        while (matcher_0.find()) {
            System.out.println(matcher_0.group());  //不传入参数,默认调用group(0)
        }
        System.out.println("-----------------------------------");
        while (matcher_1.find()) {
            System.out.println(matcher_1.group());
        }
        System.out.println("-----------------------------------");
        while (matcher_2.find()) {
            System.out.println(matcher_2.group());
        }
    }
}

                运行结果: 


五、常用类

        1.Pattern : 

                1° 简介 

        Pattern类对象是一个正则表达式对象。Pattern类没有公共构造方法,要创建一个Pattern对象,需要调用其公共静态方法compile(regStr),该方法接收一个正则表达式作为第一个参数,并最终返回一个Pattern对象

                2° 常用方法 

                    matches(regStr, context)方法,返回一个布尔类型的变量,用于整体匹配,要求regStr匹配的是context整体,否则返回false。(底层实际仍然创建了Pattern和Matcher对象,并且,Pattern类的matches方法实际使用了Matcher类中的matches方法);因此,使用matches方法时,不要求正则表达式中要用^$定位符代码如下 : 

package csdn;

import java.util.regex.Pattern;

class Fruit {
    public static void main(String[] args) {
        String context = "Cyandjswojdao____dadwah21421212512@@@";

        String regStr = "Cyan.*";

        boolean matRes = Pattern.matches(regStr, context);
        System.out.println(matRes ? true : false);
    }
}

                运行结果 :

                当仅需要对context进行整体判断,而不需要保存匹配结果时,就可以使用matches方法,代码更加简洁明了

        2.Matcher : 

                1° 简介 

        Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern类一样,Matcher类也没有公共构造方法,需要调用Pattern对象的matcher(context)方法来获得一个Matcher对象。

                2° 常用方法

方法描述
public int start()返回上次匹配的起始索引
public int start(int group)返回上次匹配指定组的起始索引
public int end()返回上次匹配的结束索引
public int end(int group)返回上次匹配指定组的结束索引
public boolean lookingAt()尝试从输入序列开头进行匹配
public boolean find()尝试查找匹配当前模式的下一个子序列
public boolean find(int start)重置当前匹配器,并从输入序列指定索引处开始匹配
public boolean matches()尝试将整个区域(输入序列)进行匹配
public String replaceAll(String replacement)用指定字符串替换原输入序列中满足模式的子字符串,并最终返回替换后的结果
public String replaceFirst(String replacement)只替换满足模式的第一个子字符串,并返回替换后的结果

        3.PatternSyntaxException : 

                1° 简介

        PatternSyntaxException是一个非强制异常类,表示一个正则表达式中的语法错误


六、反向引用

        1.定义 : 

        分组后,圆括号中的内容被捕获,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,称为“反向引用”反向引用既可以存在于正则表达式的内部,使用\\ + 组号或者\\ + 组号{n}也可以存在于外部,使用$ + 组号

        2.反向引用实例 : 

                以RegExp_Demo7类为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class RegExp_Demo7 {
    public static void main(String[] args) {
        String context = "2332, I have 1111 love ,1331 patience and 5555 peace";

        //match a number consist of four sequent identical numbers
        String regStr = "(\\d)\\1{3}";
        String regStr_EX = "(\\d)(\\d)\\2\\1"; //The number 1111 also correspond to that pattern

        Pattern pattern = Pattern.compile(regStr);
        Pattern pattern_EX = Pattern.compile(regStr_EX);

        Matcher matcher = pattern.matcher(context);
        Matcher matcher_EX = pattern_EX.matcher(context);

        while (matcher.find()) {
            System.out.println(matcher.group(0));
        }
        System.out.println("----------------------------");
        while (matcher_EX.find()) {
            System.out.println(matcher_EX.group(0));
        }
    }
}

                运行结果 :  

        3.结巴去重实例 : 

                以RegExp_Demo8为演示类,代码如下 : 

package csdn.advanced.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegExp_Demo8 {
    public static void main(String[] args) {
        String context = "I ....reliiiiish .......eeeeeeating gggggrape....!";
        System.out.println("state.0 = " + context);

        String regStr = "\\.";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(context);

        //1.去除"."
        context = matcher.replaceAll("");
        System.out.println("stage.1 = " + context);

        //2.去重结巴
        matcher = Pattern.compile("(.)\\1+").matcher(context);

        //正则表达式外部的反向应用 ——— “$ + 组号”
        context = matcher.replaceAll("$1");
        System.out.println("state.2 = " + context);
    }
}


七、总结

        首先,对于一般的正则表达式的使用步骤(Pattern-Matcher)要熟悉;其次,对于regStr中一些常用的元字符要熟悉;此外,捕获分组和非捕获分组要有印象,反向引用及其利处也要了解。

        PS : String类中的一些方法,例如replaceAll, matches, split等,也支持正则表达式。

        System.out.println("END----------------------------------------------------------------------------"); 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图简介-数据结构和算法教程

介绍 图是由顶点和边组成的非线性数据结构。顶点有时也被称为节点&#xff0c;并且边是连接图中的任何两个节点的线或弧。更正式地说&#xff0c;一个图是由一组顶点&#xff08;V&#xff09;和一组边&#xff08;E&#xff09;组成的。该图表示为G&#xff08;V&#xff0c;…

Win11的两个实用技巧系列之亮度条消的解决办法

Win11更新后无法调节亮度怎么办 Win11亮度条消的解决办法 Win11更新后无法调节亮度怎么办&#xff1f;win11系统升级以后&#xff0c;发现屏幕亮度不能调节&#xff0c;没有亮度调节按钮了&#xff0c;下面我们就来看看Win11亮度条消的解决办法 电脑更新后&#xff0c;亮度条消…

如何设计可以动态扩容缩容的分库分表方案?

对于分库分表来说&#xff0c;主要是面对以下问题&#xff1a; 选择一个数据库中间件&#xff0c;调研、学习、测试&#xff1b;设计你的分库分表的一个方案&#xff0c;你要分成多少个库&#xff0c;每个库分成多少个表&#xff0c;比如 3 个库&#xff0c; 每个库 4 个表&am…

SpringSecurity(五):前后端分离认证总结案例。

前后端分离认证总结案例 前言难点分析Controller层eneity层RoleUser dao层service层config层LoginFilterSecurityConfig resourcesmapper propertiespom.xml结尾 前言 和上一篇一样&#xff0c;从上倒下复制粘贴&#xff0c;所有代码贴完再运行&#xff0c;代码没有问题&#…

初步学习使用SpringBoot框架(手动插入数据模拟访问数据库)

对于SpringBoot框架介绍大家可以看看这个这篇文章&#xff0c;SpringBoot优缺点以及如何安装使用 以下我是按照老师给的安装方法进行安装使用SpringBoot框架&#xff1a; 大家安装SpringBoot框架时候&#xff0c;最好安装3.0以下的&#xff0c;不然需要对应较高版本的JDK版本&…

【Axure教程】拖动调整行高列宽的表格

表格是在系统软件中非常常用的工具。表格通常由行和列组成&#xff0c;用于以结构化的方式显示和组织数据。它们在各种场景中都有广泛的应用&#xff0c;包括数据分析、数据录入、报表生成、项目管理和数据可视化等领域。 今天作者就教大家如何在Axure里制作一个能通过鼠标拖动…

阿里巴巴最新 SpringCloudAlibaba 学习笔记,全程通俗易懂,一套搞懂!

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件&#xff0c;依托 Spring Cloud Alibaba&#xff0c;只需要添加一些注解和少量配置&#xff0c;就可以将 Spring Cloud 应用接入阿里微服务解决方案&#xff0c;通过阿里…

Visual C++中函数的覆盖和函数的隐藏

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊Visual C中函数的覆盖和函数的隐藏。 Visual C中函数的覆盖和函数的隐藏与JAVA有很大不同&#xff0c;有些容易搞错的点和概念&#xff0c;我们要特别注意。 首先&#xff0c;先满足一下急性子的…

【刷题笔记——链表专栏】牛客网:合并两个排序链表

【刷题笔记——链表专栏】牛客网&#xff1a;合并两个排序链表 一、题目描述 二、思路分析 1、创建新的头节点newHead&#xff08;注意这一步&#xff09; 2、循环遍历pHead1和pHead2并进行链表并进行合并&#xff0c;直到pHead1和pHead2其中有一个为null时结束循环 3、合并完…

Win10,Win11玩游戏找不到d3dx9怎么解决

相信有些朋友遇到了d3dx9_42.dll丢失的情况不知道怎么解决&#xff0c;而今日小编带来的这篇文章就是讲解关于d3dx9_42.dll丢失进行修复的操作内容&#xff0c;d3dx9_42.dll丢失怎么解决&#xff1f;&#xff08;修复方法&#xff09;d3dx9 42.dll文件是DirectX中必备文件,许多…

【期末不挂科 学习数据结构】

期末不挂科 学习数据结构 第一章绪论1.1数据结构的基本概念1.1.1基本概念和术语1.数据2.数据元素3.数据对象4.数据类型5.数据结构 1.1.2数据结构三要素1.数据的逻辑结构2.数据的存储结构3.数据的运算 第一章绪论 1.1数据结构的基本概念 1.1.1基本概念和术语 1.数据 数据是信…

Redis7【⑧ Redis集群(cluster)】

Redis集群 Redis 集群是 Redis 数据库的分布式解决方案&#xff0c;它可以将数据分散存储在多个节点上&#xff0c;以支持大规模数据存储和高并发访问。 Redis 集群使用的是基于槽的分区策略&#xff0c;即将数据分成固定数量的槽&#xff0c;每个槽由一个主节点和多个从节点组…

Python基础教程: 入门简介

Python 最初由 Guido van Rossum 在 1991 年开发&#xff0c;当时他在执行其他项目的时候需要编写一个简单的解释器。Python 最初只是一种简单的脚本语言&#xff0c;但在后来的发展中&#xff0c;它迅速成为一种流行的编程语言。 Python 不仅在大型科技企业中应用广泛&#x…

spring cloud 之 gateway

网关介绍 在微服务架构体系中&#xff0c;一个系统会被拆分为很多个微服务&#xff0c;那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别调用&#xff0c;当然这样是不现实的…

Mysql事务原理

一、概述 事务&#xff1a;一组操作要么全部成功&#xff0c;要么全部失败&#xff0c;目的是为了保证数据最终的一致性。 数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可…

水站桶装水订水系统桶装水小程序,改变了桶装水行业传统的送水模式;

水站桶装水订水系统桶装水小程序&#xff0c;改变了桶装水行业传统的送水模式&#xff0c;客户通过线上下单&#xff0c;送水工实时接单配送&#xff0c;空桶更好的记录管理&#xff0c;财务数据在后台清晰明了&#xff0c;提高了水站的工作效率。 除此之外&#xff0c;还有很多…

网络系统集成实验(五)| 系统集成路由器OSPF动态、综合路由配置

一、前言 该系列文章将会对网络系统集成课程中相关实验进行更新&#xff0c;本篇为第五篇&#xff0c;有关路由器的OSPF、综合路由配置&#xff0c;包括了OSPF的配置实验、单臂路由实验、RIP配置实验、综合实验等。 注意&#xff1a;该实验的后半部分综合实验基于前面的实验&am…

java Collection集合使用笔记

1、Collection集合概述 它是单例集合的最顶层接口&#xff0c;它表示一组对象&#xff0c;这些对象也称之为Collection的元素JDK不提供此接口任何直接实现&#xff0c;但提供更具体的子接口&#xff08;如&#xff1a;List和Set&#xff09;实现创建Collection集合对象的方法&…

麒麟信安与飞腾携手共赴云端

当前各行业已进入全面云化时代&#xff0c;云桌面技术作为典型办公终端替代方案&#xff0c;凭借其数据安全、便捷运维、综合成本占优的优势正逐步在各行业应用实施。伴随十四五规划加速数字化转型及信息产业核心技术自主化发展&#xff0c;各政企组织迫切需要基于国产软硬件实…

gmap构建离线地图,用createCustomerTiledLayer方法,瓦片地址尾部多了 ?x={x}y={y}z{z} 导致无法显示地图。

gmap构建离线地图&#xff0c;用createCustomerTiledLayer方法&#xff0c;瓦片地址尾部多了 ?x{x}&y{y}&z&{z} 导致无法显示地图。 function initMap() {this.map new GL.Map(map, {center: "120.650847,31.3092434",zoom: 12,zoomControl: false,sca…