正则表达式入坟文章

本来我们只有一个问题,当我们想到了用正则表达式可以解决,那么就产生了两个问题

一. 什么是正则表达式

正则表达式(Regular Expression)是一种描述文本内容组成规律的表示方式。它处理文本的能力非常强。比如可以校验手机号和邮箱是否符合规则,还可以从文本和网页中提取自己想要的内容,还能做文本替换、切割等操作。


二. 元字符

元字符就是在正则表达式中具有特殊意义的字符。正则就是由一系列的元字符组成的。例如在一个普通的文本中,使用ctrl + f组合何以查询一个字符串,例如下面这样:
在这里插入图片描述但是如果想要找到所有的数字就不是那么容易了,这时候就需要正则表达式了,例如:
在这里插入图片描述
这里的\d{11}就是元字符。

元字符分为以下几种:

  1. 特殊的单独字符
  2. 空白符号
  3. 表示范围
  4. 量词
  5. 断言

2.1 特殊单字符

主要常用的有\d\w\s以及\D\W\S

  1. \d表示任意的单个数字
  2. \w表示任意的单个数字或者字母或者下划线_
  3. \s表示任意单个空白符,空格换行这些
  4. 大写代表它们与之相反的意思,例如\D表示任意的单个非数字字符

2.2 空白符号

主要有换行符\n、tab制表符\t等,大部分时候使用\s即可。

  1. \r回车符
  2. \n换行符
  3. \t制表符
  4. \f换页符
  5. 空格(英文空格即可)
  6. \v垂直制表符
  7. \s任意空白字符

2.3 量词

当我们想让一个字符多次重复匹配的时候,就需要量词。比如想要匹配5个数字可以写\d\d\d\d\d,但是100次就没办法了。

在正则中,*代表出现零次到多次,+代表 一次到多次,?代表零次到一次,{m,n}代表出现m到n次。(*等价于{0,}

比如,如下的写法可以匹配到四种结果:
在这里插入图片描述

首先1234561234匹配上了两次,因为*可以匹配0次,所以在第一行和第二行的结尾出匹配到了两个空的数字情况


2.4 范围

范围的功能就是从多个字符里面任选其一,例如在某个文本位置上想要1-3的数字,这时候上面的量词和元字符也没办法实现。范围主要分以下几种:

  1. 或的情况,|,比如ab|bc代表这个位置既可以是ab,也可以是bc,都能匹配上
  2. [...]多选一,括号中写几个元素,比如[123]就是在当前匹配位置上是它们三个之一即可
  3. [a-z]表示匹配a到z中的任意一个元素,这里是按照ASCII表来的,如果写[A-z]会把一些乱七八糟的字符也包含进去(这里只是打个比方)
  4. [^...]表示不是当前括号中的元素即可,例如[^123]表示这个匹配位置不是123就行

三. 正则的模式

正则主要分为三种模式:

  1. 贪婪匹配
  2. 非贪婪匹配
  3. 独占模式

这些模式会改变量词!的匹配行为,例如匹配长度是尽可能长还是尽可能短


3.1 贪婪模式

正则中默认的量词匹配是贪婪的,会按照最大长度去匹配(注意看的时候要符合文本的规则,不然很容易看乱)
比如上面的数字案例,\d*可以匹配到0个,但是他还是按照最长的匹配办法去匹配到了123456,这种就是贪婪模式


3.2 非贪婪模式

使用的方法是在量词的后面加上?,示例如下:
在这里插入图片描述

这里就是在符合整体文本条件的规则下尽可能的让匹配长度短,每个间隔也符合条件(零个),能匹配一个数字就直接过,去进行下一次匹配。


3.3 独占模式

前两种模式中需要发生回溯完成相应的功能,部分情况不需要回溯,就可以使用独占模式

什么是回溯?
比如说贪婪模式中在这里插入图片描述
在匹配r的时候,前两次正常匹配上了,然后读入文本的y,此时发现和第三个r不匹配,那么就会将文本的y吐出来,正则的第三个r也会被放弃掉,走到正则的y处和文本的y匹配
同理,非贪婪匹配中第一个r匹配上了,正则就会走到y,匹配文本的r,这时候发现匹配不上,那么就会发生回溯,让前面的r再去匹配,然后用掉两个r时候再用y去匹配文本的y
在这里插入图片描述
PS:一个好的理解方法是将重心放在正则上,回溯就是在贪或不贪的基础上不断试错,例如贪,如果后面匹配不上了,前面就得少贪。不贪匹配不上了前面就得多贪尝试。

独占模式的使用方法是在量词后面加上+,独占模式也是尽可能多的去匹配,只不过失败就结束而不会回溯,稍微修改一下上面的例子(贪婪模式下):
在这里插入图片描述
依然可以匹配上,因为在贪的基础上正则倒数第二个r匹配不上了,那么前面带量词的r就会回溯吐出来一个,给后面尝试匹配。但是独占模式这个不会回溯,那这个文本的r就吐不出来,正则也就无法匹配了。
在这里插入图片描述
需要注意的点:

  1. Go的标准库不支持独占模式
  2. 独占模式性能较好,因为不会发生大量回溯,但是可能完不成功能

四. 分组与引用

在量词中?表示出现0次或者1次。同时这个符号也表示非贪婪匹配。那么如果想要表达下面这个场景该怎么办?
选出连续的15个数字或者18个数字:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1. 基础概念 汇编语言是一种低级语言,它是计算机硬件指令的助记符。汇编语言直接反映了计算机的硬件结构,可以直接操作计算机的硬件资源。 汇编语言的基本单位是汇编指令,它由操作码和操作数两部分组成。操作码表示要执行的操作,操作数表示操作的对象或数据。 汇编语言的程序由若干条汇编指令组成,程序的执行顺序由程序中的指令顺序决定。 2. 寄存器 寄存器是计算机中用来暂时存储数据的高速存储器件,是汇编语言中最常用的数据存储方式。 常用的寄存器有通用寄存器、段寄存器、指针寄存器、标志寄存器等。 通用寄存器包括AX、BX、CX、DX等,可以用来存储数据、地址、偏移量等。 段寄存器包括CS、DS、SS、ES等,用来存储段地址。 指针寄存器包括SP、BP、SI、DI等,用来存储栈指针、基址指针、源地址指针、目的地址指针等。 标志寄存器包括CF、PF、AF、ZF、SF、OF等,用来存储运算结果的状态信息。 3. 指令集 汇编语言的指令集包括数据传送指令、算术指令、逻辑指令、比较指令、跳转指令、循环指令等。 数据传送指令用来把数据从一个地方传送到另一个地方,包括MOV、XCHG、LEA等。 算术指令用来进行加、减、乘、除等运算,包括ADD、SUB、MUL、DIV等。 逻辑指令用来进行位运算,包括AND、OR、NOT、XOR等。 比较指令用来比较两个数据的大小关系,包括CMP、TEST等。 跳转指令用来改变程序的执行顺序,包括JMP、JZ、JNZ、JE、JNE等。 循环指令用来重复执行一段程序,包括LOOP、LOOPE、LOOPZ、LOOPNE、LOOPNZ等。 4. 程序设计 汇编语言的程序设计需要掌握一定的技巧和方法,包括程序的结构、数据的处理、流程控制等。 程序的结构包括程序的头部、数据段、代码段、堆栈段等。 数据的处理包括数据类型、数据的存储和读取、数据的转换等。 流程控制包括条件判断、循环控制、函数调用等。 5. 汇编器和调试器 汇编器是将汇编语言程序翻译成机器语言程序的工具,可以将汇编语言程序转换成目标代码或可执行文件。 调试器是用来调试程序的工具,可以帮助程序员查找程序中的错误、调试程序的执行流程等。 6. 总结 学习汇编语言需要掌握基本概念、寄存器、指令集、程序设计、汇编器和调试器等知识,需要进行大量的实践和练习,才能掌握汇编语言的编程技巧和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值