正则表达式基本使用

news2024/11/29 2:39:40

文章目录

  • 1. 基本介绍
  • 2. 元字符(Metacharacter)-转义号 \\
  • 3. 元字符-字符匹配符
    • 3.1 案例
  • 4. 元字符-选择匹配符
  • 5. 元字符-限定符
  • 6. 元字符-定位符
  • 7. 分组
    • 7.1 捕获分组
    • 7.2 非捕获分组
  • 8. 非贪婪匹配
  • 9. 应用实例
  • 10. 正则验证复杂URL

1. 基本介绍

  • 如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
  1. 限定符
  2. 选择匹配符
  3. 分组组合和反向引用符
  4. 特殊字符
  5. 字符匹配符
  6. 定位符

2. 元字符(Metacharacter)-转义号 \

  • \\符号说明:在使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。
  • 案例:用$去匹配“abc$(”,用(去匹配 “abc$(abc(123(
	String content = "abc$(abc(123(";
	String regStr = "\\(";
	Pattern pattern = Pattern.compile(regStr);
	Matcher matcher = pattern.matcher(content);
	while (matcher.find()) {
	    System.out.println("找到:" + matcher.group(0));
	}

在这里插入图片描述

  • 需要用到转义符号的字符有以下:.*+()$/\?[] ^{}

3. 元字符-字符匹配符

在这里插入图片描述
在这里插入图片描述

匹配任意三个数字
\\d\\d\\d = \\d{3}
?表示后面是0个数字或1个数字
\\d{3}(\\d)?
相当于对 \\d 取反,表示匹配单个非数字字符
\\D = [^0-9]
+ 表示1个或多个,至少一个
\\W+\\d{2} 
String regStr = "[a-z]";//匹配 a-z 之间任意一个字符
String regStr = "[A-Z]";//匹配 A-Z 之间任意一个字符
String regStr = "abc";//匹配 abc 字符串[默认区分大小写]
String regStr = "(?i)abc";//匹配 abc 字符串[不区分大小写]

3.1 案例

  1. [a-z]表示可以匹配a-z中任意一个字符,比如[A-Z]去匹配 11A22B33C
String content = "11A22B33C";
String regStr = "[A-Z]";
Pattern pattern = Pattern.compile(regStr)
Matcher matcher = pattern.matcher(content);

while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

在这里插入图片描述

  1. java正则表达式默认是区分字母大小写的,如何实现不区分大小写
(?i)abc:表示abc都不区分大小写
a(?i)bc:表示bc不区分大小写
a((?i)b)c:表示只有b不区分大小写
Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
  • 当创建 Pattern 对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
  • [A-Z]表示可以匹配 A-Z 中任意一个字符
  • [0-9]表示可以匹配 0-9 中任意一个字符
String regStr = "abc";//匹配 abc 字符串[默认区分大小写]
String regStr = "(?i)abc";//匹配 abc 字符串[不区分大小写]
  1. [^a-z]表示可以匹配不是a-z中的任意一个字符
String content = "11A22B33CabcABC";
String regStr = "[^a-z]"; // 匹配不在 a-z 之间的任意一个字符
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

在这里插入图片描述

String regStr = "[^a-z]{2}"; // 匹配不在 a-z 之间的任意两个字符

在这里插入图片描述

String regStr = "[^0-9]"; // 匹配不在 0-9 之间的任意一个字符

在这里插入图片描述

  1. [abcd] 表示可以匹配abcd中的任意一个字符
String content = "1A2B3CabeABE";
String regStr = "[abcd]";

//当创建 Pattern 对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写
Pattern pattern = Pattern.compile(regStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);

while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

在这里插入图片描述

  1. [^abcd]表示可以匹配不是abcd中的任意一个字符
  2. \\d表示可以匹配0-9的任意一个数字,相当于[0-9]
  3. \\D表示可以匹配不是0-9中的任意一个数字,相当于[^0-9]
  4. \\w匹配任意英文字符、数字和下划线,相当于[a-zA-Z0-9_]
  5. \\W相当于[^a-zA-Z0-9],是\w刚好相反
  6. \\s匹配任何空白字符(空格,制表符等)
  7. \\S 匹配任何非空白字符,和\s相反
  8. . 匹配出\n之外的所有字符,如果要匹配,本身则需要使用 \\.

4. 元字符-选择匹配符

  • 在匹配某个字符串的时候是选择性的,即:既可以匹配这个,又可以匹配那个,这时需要用到选择匹配符号
    在这里插入图片描述
  • 案例:
String content = "AA兮BB动CC人";
String regStr = "兮|动|人";

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

while (matcher.find()) {
    System.out.println("找到:" + matcher.group(0));
}

在这里插入图片描述

5. 元字符-限定符

  • 用于指定其前面的字符和组合项连续出现多少次
    在这里插入图片描述
    在这里插入图片描述
*:表示0或n个,0到多,[0, ∞)
+:表示至少1个,1到多,[1, ∞)
?:表示至多一个,0或1,[0, 1]
{n}:表示任意长度为n的字符串
{n,}:表示组成的任意长度不小于n的字符串,[n, ∞)
{n,m}:表示组成的任意长度不小于n、不大于m的字符串,[n,m]
  • 案例:

1、n表示出现的次数,比如:a{3},1{4},\\d{2}

String context = "111111aaa";

 // 表示匹配 aaa
 String regStr = "a{3}";
 Pattern pattern = Pattern.compile(regStr);
 Matcher matcher = pattern.matcher(context);

 while (matcher.find()) {
     System.out.println("找到 " + matcher.group(0));
 }

在这里插入图片描述

  • 下面有 7个 1,但只能匹配到一组
String context = "1111111aaa";
// 表示匹配连续4个1
String regStr = "1{4}";

在这里插入图片描述

  • 有7个1,但只能匹配到3组
// 表示匹配长度为2的任意数字字符
String context = "1111111aaa";
String regStr = "\\d{2}";

在这里插入图片描述

  • 注意: Java匹配默认是贪婪匹配,即尽可能匹配多的
String context = "1111111aaaa33333";
// 表示匹配 aaa 或 aaaa
String regStr = "a{3,4}";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}
  • 优先匹配 4个a的情况
    在这里插入图片描述
  • 如:换成6个a的情况下,如果每次都匹配3个a就正好匹配到,但Java默认的是贪婪模式,尽可能的匹配多的,所以就先匹配4个a,余下2个a就不会被匹配到
String context = "1111111aaaaaa33333";

在这里插入图片描述

  • \\d{2,5},下面有7个1,先匹配前5个1,后面2个1也符合长度范围,都能被匹配到
String context = "1111111aaaaaa";
// 表示匹配长度为 [2,5]之间的数字字符
String regStr = "\\d{2,5}";

在这里插入图片描述

  • 1+:默认还是贪婪匹配,所以会一次性全部匹配到7个1
String context = "1111111aaaaaa";
String regStr = "1+";

在这里插入图片描述

  • \\d+:匹配一个数字或多个数字
String context = "1111111aaaaaa";
// 匹配一个数字或多个数字
String regStr = "\\d+";

在这里插入图片描述

  • 1*:匹配0个1或多个1
  • a1?:匹配 a 或 a1
String context = "a11111111aaaaaa";
String regStr = "a1?";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
   System.out.println("找到 " + matcher.group(0));
}
  • 还是会遵循贪心匹配原则,先匹配 a1,再匹配 a
    在这里插入图片描述

  • 换成 a2? ,由于没有 a2 ,所以只能匹配到 a
    在这里插入图片描述

6. 元字符-定位符

  • 定位符, 规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置
    在这里插入图片描述

1、^

  • 指定起始字符
String context = "123abc";
// 以至少1个数字开头,后接任意个小写字母的字符串
String regStr = "^[0-9]+[a-z]*";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

在这里插入图片描述

  • 内容改为:String context = "123abc12";也还是可以匹配到
    在这里插入图片描述
  • 内容改为:String context = "123";也还是可以匹配到
    在这里插入图片描述

2、$

  • 指定结束字符
String context = "123abc";
// 以至少1个数字开头,以至少一个小写字母结尾
String regStr = "^[0-9]+[a-z]+$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

在这里插入图片描述

String context = "123-a";
String regStr = "^[0-9]+\\-[a-z]+$";

在这里插入图片描述

3、\\b

  • 匹配目标字符串的边界,这里的边界是指被匹配的字符串的最后,也可以是空格的字符串后面
String context = "xdrxidongren asdfxdr qwerxdr";
// 表示匹配边界是 xdr,这里的边界是指被匹配的字符串的最后,也可以是空格的字符串后面
String regStr = "xdr\\b";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

在这里插入图片描述

4、\\B

  • 匹配目标字符串的非边界
String context = "xdrxidongren asdfxdr qwerxdr";
String regStr = "xdr\\B";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

在这里插入图片描述

7. 分组

7.1 捕获分组

在这里插入图片描述

1、非命名分组

String context = "xdrxidongren xdr1998 qwer2008xdr";
// 匹配4个数字的字符串
String regStr = "(\\d\\d)(\\d\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);

while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
    System.out.println("第1个分组内容 " + matcher.group(1));
    System.out.println("第2个分组内容 " + matcher.group(2));
}

在这里插入图片描述

  • 分成3组
String context = "xdrxidongren xdr1998 qwer2008xdr";
String regStr = "(\\d\\d)(\\d)(\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
    System.out.println("第1个分组内容 " + matcher.group(1));
    System.out.println("第2个分组内容 " + matcher.group(2));
    System.out.println("第3个分组内容 " + matcher.group(3));
}

在这里插入图片描述

2、命名分组

  • 即可以给分组取名
String context = "xdrxidongren xdr1998 qwer2008xdr";
// 命名分组
String regStr = "(?<group1>\\d\\d)(?<group2>\\d\\d)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
    System.out.println("第1个分组内容 " + matcher.group(1));
    System.out.println("第1个分组内容[通过组名] " + matcher.group("group1"));
    System.out.println("第2个分组内容 " + matcher.group(2));
    System.out.println("第2个分组内容[通过组名] " + matcher.group("group2"));
}

在这里插入图片描述

7.2 非捕获分组

在这里插入图片描述

1、(?:pattern)

String context = "xdr兮动人123 yunxdr兮动人456 兮动人789qwer";
// String regStr = "兮动人123|兮动人456|兮动人789";
// 上面的写法可以等价于非捕获分组,注意:非捕获分组不能使用 matcher.group(1)
String regStr = "兮动人(?:123|456|789)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

在这里插入图片描述

2、(?=pattern)

  • 只匹配有选项的内容
String context = "xdr兮动人123 yunxdr兮动人456 兮动人789qwer";
// 非捕获分组不能使用 matcher.group(1)
String regStr = "兮动人(?:123|456)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

在这里插入图片描述

3、(?!pattern)

  • (?=pattern) 取反,匹配选项中非的情况
String context = "xdr兮动人123 yunxdr兮动人456 兮动人789qwer";
// 查出不是 兮动人123 和 兮动人456 的内容
String regStr = "兮动人(?!123|456)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}
  • 最后会匹配到 兮动人789 中的 兮动人
    在这里插入图片描述

8. 非贪婪匹配

// 默认是贪婪匹配,会尽量匹配最多的字符串
String context = "xdr630 yunxdr";
String regStr = "\\d+";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
while (matcher.find()) {
    System.out.println("找到 " + matcher.group(0));
}

在这里插入图片描述

  • 改为非贪婪匹配(尽量匹配少的),就会一次只匹配一个数字
String regStr = "\\d+?";

在这里插入图片描述

9. 应用实例

  • 对字符串进行如下验证

1、汉字

String context = "兮动人";
// 汉字
String regStr = "^[\u0391-\uffe5]+$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

在这里插入图片描述

2、邮政编码,要求:1-9 开头的一个六位数,比如:352189

String context = "352189";
String regStr = "^[1-9]\\d{5}$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

3、QQ号码,要求:1-9 开头的一个(5 位数-10位数) ,如: 1123762674

String context = "1123762674";
String regStr = "^[1-9]\\d{4,9}$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

4、手机号码,要求:必须以 13,14,15,18 开头的 11 位数

String context = "15933567680";
String regStr = "^1[3|4|5|8]\\d{9}";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(context);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

10. 正则验证复杂URL

  • 如:匹配B站视频的url
/**
 * 思路:
 * 1.先确定url的开始部分 https:// | http://
 * 2.通过 ([\w-]+\.)+[\w-]+ 匹配 www.bilibili.com
 * 3. /video/BV1QA41187CL 匹配
 */
String content = "https://www.bilibili.com/video/BV1QA41187CL";
// 注意:[.]表示匹配的就是.本身
String regStr = "^((http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.]*)?$";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
    System.out.println("满足格式");
} else {
    System.out.println("不满足格式");
}

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

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

相关文章

【计算机取证篇】Windows禁用驱动程序签名教程

【计算机取证篇】Windows禁用驱动程序签名教程 高级启动—【蘇小沐】 文章目录 【计算机取证篇】Windows禁用驱动程序签名教程1、实验环境 &#xff08;一&#xff09;驱动问题&#xff1a;驱动安装失败&#xff08;二&#xff09;高级启动&#xff1a;F7禁用驱动程序强制签名…

2023年9月随笔之摩托车驾考

1. 回头看 日更坚持了273天。 读《SQL学习指南&#xff08;第3版&#xff09;》更新完成 读《高性能MySQL&#xff08;第4版&#xff09;》持续更新 学信息系统项目管理师第4版系列持续更新 9月码字81307字&#xff0c;日均码字数2710字&#xff0c;累计码字451704字&…

基于Java的二手交易系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了

找到IIS管理器启动程序的所在位置 并在cmd命令行中调用 inetmgr.exe /reset 进行重启 先查看IIS管理器属性&#xff0c;找到其位置 管理员模式打开cmd命令行&#xff0c;并切换到上面的文件夹下运行Inetmgr.exe /reset 运行完成后可以重新看到IIS窗口 原因&#xff1a;由于某…

图神经网络GNN(一)GraphEmbedding

DeepWalk 使用随机游走采样得到每个结点x的上下文信息&#xff0c;记作Context(x)。 SkipGram优化的目标函数&#xff1a;P(Context(x)|x;θ) θ argmax P(Context(x)|x;θ) DeepWalk这种GraphEmbedding方法是一种无监督方法&#xff0c;个人理解有点类似生成模型的Encoder过程…

【多线程初阶】多线程案例之线程池

文章目录 前言1. 什么是线程池1.1 线程池的优势 2. 标准库中的线程池2.1 聊聊工厂模式2.2 Executors 创建线程池的几种方式2.3 ThreadPoolExecutor 构造方法中的几个参数2.3.1 RejectedExecutionHandler handler 的几个拒绝策略 3. 自己实现一个线程池总结 前言 本文主要给大家…

【COMP304 LEC3】

LEC 3 1. Contingent Formulas&#xff1a; 定义&#xff1a;Truth or falsity of a propositional formula depends on the truth/falsity of the atoms in the formula 例子&#xff1a;p ∧ q is true if both p and q are true, false otherwise.这里p和q就是atoms&…

[React] 性能优化相关 (一)

文章目录 1.React.memo2.useMemo3.useCallback4.useTransition5.useDeferredValue 1.React.memo 当父组件被重新渲染的时候&#xff0c;也会触发子组件的重新渲染&#xff0c;这样就多出了无意义的性能开销。如果子组件的状态没有发生变化&#xff0c;则子组件是不需要被重新渲…

计算机网络笔记 第二章 物理层

2.1 物理层概述 物理层要实现的功能 物理层接口特性 机械特性 形状和尺寸引脚数目和排列固定和锁定装置 电气特性 信号电压的范围阻抗匹配的情况传输速率距离限制 功能特性 -规定接口电缆的各条信号线的作用 过程特性 规定在信号线上传输比特流的一组操作过程&#xff0…

论文研读 - share work - QPipe:一种并行流水线的查询执行引擎

QPipe&#xff1a;一种并行流水线的查询执行引擎 QPipe: A Simultaneously Pipelined Relational Query Engine 关系型数据库通常独立执行并发的查询&#xff0c;每个查询都需执行一系列相关算子。为了充分利用并发查询中的数据扫描与计算&#xff0c;现有研究提出了丰富的技术…

进程之间的通信方式(共享存储,消息传递,管道通信)

进程通信 进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是指两个进程之间产生数据交互。进程是分配系统资源的单位(包括内存地址空间)&#xff0c;因此各进程拥有的内存地址空间相互独立。为了保证安全&#xff0c;一个进程不能直接访问另一…

计算机网络学习易错点

目录 概述 1.internet和Internet的区别 2.面向连接和无连接 3.不同的T 4.传输速率和传播速率 5.传播时延和传输时延&#xff08;发送时延&#xff09; 6.语法&#xff0c;语义和同步 一.物理层 1.传输媒体与物理层 2.同步通信和异步通信 3.位同步&#xff08;比特同…

【算法分析与设计】贪心算法(下)

目录 一、单源最短路径1.1 算法基本思想1.2 算法设计思想1.3 算法的正确性和计算复杂性1.4 归纳证明思路1.5 归纳步骤证明 二、最小生成树2.1 最小生成树性质2.1.1 生成树的性质2.1.2 生成树性质的应用 2.2 Prim算法2.2.1 正确性证明2.2.2 归纳基础2.2.3 归纳步骤2.3 Kruskal算…

debian设置允许ssh连接

解决新debian系统安装后不能通过ssh连接的问题。 默认情况下&#xff0c;Debian系统不开启SSH远程登录&#xff0c;需要手动安装SSH软件包并设置开机启动。 > 设置允许root登录传送门&#xff1a;debian设置允许root登录 首先检查/etc/ssh/sshd_config文件是否存在。 注意…

TFT LCD刷新原理及LCD时序参数总结(LCD时序,写的挺好)

cd工作原理目前不了解&#xff0c;日后会在博客中添加这一部分的内容。 1.LCD工作原理[1] 我对LCD的工作原理也仅仅处在了解的地步&#xff0c;下面基于NXP公司对LCD工作原理介绍的ppt来学习一下。 LCD(liquid crystal display,液晶显示屏) 是由液晶段阵列组成&#xff0c;当…

【EasyPoi】SpringBoot使用EasyPoi自定义模版导出Excel

EasyPoi 官方文档&#xff1a;http://doc.wupaas.com/docs/easypoi Excel模版导出 引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency…

newstarctf

wp web: 1.rce 可以发现这个变量名有下划线也有点。 $code$_POST[e_v.a.l]; 这时候如果直接按这个变量名来传参&#xff0c;php 是无法接收到这个值的&#xff0c;具体原因是 php 会自动把一些不合法的字符转化为下划线&#xff08;注&#xff1a;php8以下&#xff09;&am…

【论文极速读】IMAGEBIND —— 通过图片作为桥梁桥联多模态语义

【论文极速读】IMAGEBIND —— 通过图片作为桥梁桥联多模态语义 FesianXu 20230929 at Baidu Search Team 前言 当前大部分多模态工作都集中在图片-文本、视频-文本中&#xff0c;关于音频、深度图、热值图的工作则比较少&#xff0c;在IMAGEBIND中&#xff0c;作者提出了一种…

Neo4j最新安装教程(图文版)

目录 一、软件介绍 二、下载软件 1、官方下载 2、云盘下载 三、安装教程 1、首先配置Neo4j的环境变量 2、启动neo4j服务器 3、访问界面 一、软件介绍 官网地址&#xff1a;https://neo4j.com/ Neo4j是一个高性能、可扩展的图数据库管理系统。它专注于存储、查询和处理大…

Explain执行计划字段解释说明---ID字段说明

ID字段说明 1、select查询的序列号,包含一组数字&#xff0c;表示查询中执行select子句或操作表的顺序 2、ID的三种情况 &#xff08;1&#xff09;id相同&#xff0c;执行顺序由上至下。 &#xff08;2&#xff09;id不同&#xff0c;如果是子查询&#xff0c;id的序号会…