正则表达式之量词
正则表达式(二)
量词
量词的通用形式
字符组和字符组简记都是只能匹配一个字符,那如果需要匹配一个身份证号呢?那就需要多次重复使用字符组或者字符组简记,量词的存在便是为了解决重复的读写问题。量词的通用形式为{m,n},m,n为数字,限定字符组中字符存在的个数,闭区间,m为下限,n为上限。如\d{3,5}表示匹配字符串的长度最少为3,最大为5。
通用形式 | 描述 |
{n} | 匹配字符串长度为n |
{m,n} | 匹配字符串长度最小为m,最大为n |
{m,} | 匹配字符串长度最小为m,最大为无穷 |
{0,n} | 匹配字符串长度最小为空,最大为n |
常用量词
{m,n}为量词通用形式,正则中还存在其他量词,分别为+、*、?。常用于具体元素后,表示出现次数。如:a+表示a会存在且至少出现一次。
常用量词 | {m,n}等效形式 | 描述 |
+ | {1,} | 出现次数大于等于1 |
* | {0,} | 出现次数大于等于0 |
? | {0,1} | 出现次数为0或者1 |
点号
点号是一个特殊的元字符,可以匹配任意字符,除了空白字符中的换行符\n。所以点号并不是真正意义上的匹配任意字符,匹配任意字符有两种方法:
1.在单行匹配模式下,点号可以匹配任意字符。
2.使用通配字符组[\d\D]、[\w\W]、[\s\S]可以匹配任意字符。
任意字符是指任意单个字符,所有任意字符则是指多个任意字符。如何匹配所有任意字符呢?可以使用:.*或者[\d\D]*、[\w\W]*、[\s\S]*。
.*匹配所有任意字符问题
任意给定字符串"string",使用正则表达式 ".*"进行匹配,匹配流程为:正则“匹配字符串“,之后.*匹配s、t、r、i、n、g,最后字符串尾”是由正则的.*匹配还是由”匹配?
回答这个问题之前,需要明白量词可以划分为贪婪量词和非贪婪量词。之前接触的量词都是贪婪量词,具体表现就是:能匹配的都匹配,每匹配一个就记录当前状态,方便匹配最后出现问题回档。上面问题的实际过程是:.*会匹配字符串尾的”,并且记录匹配状态,匹配完发现字符串结束了,但是正则表达式还剩余一个”没有匹配,这就出了问题了,考虑要照顾正则中”,.*需要查看自己的匹配状态,找到自己匹配的字符串中”,然后回档,让正则”匹配字符串中的”。这种“贪吃出问题又吐出来”的过程称之为回溯。
贪婪量词:能匹配上的都匹配上,出了问题再回溯,回溯过程是把吃了的吐出来。
非贪婪量词:能匹配上的匹配一次就够,剩下字符串让后续正则字符组匹配,出了问题也回溯,回溯过程是把没吃的吃进去。
贪婪量词 | 非贪婪量词 |
* | *? |
+ | +? |
? | ?? |
{m,n} | {m,n}? |
{m,} | {m,}? |
{0,n} | {0,n}? |
非贪婪量词和贪婪量词逐一对应,只是在对应的贪婪量词后加上?,两者表达的意思也是一致,遇到不能匹配的情况都需要回溯。唯一区别在于:贪婪量词面对能匹配的情况优先选择“匹配”,非贪婪量词面对能匹配的情况优先选择“推让”。
转义
量词分为贪婪量词、非贪婪量词,又补充了点号,这些特殊含义的字符在匹配原本自身的时候,需要使用\转义。如\*、\{m,n}、\+\?等等。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring 的 WebSecurityConfigurerAdapter 过滤器
- 03.视频播放器Api说明
- Postfix配置Gmail中继发信
- 使用Syncthing自建私有同步盘
- 05.视频播放器内核切换封装
- sklearn做特征选择
- ResilioSync:公私兼备的同步盘
- 面向对象语言的三大特征: 封装 继承 多态(二)——继承
- 教你如何设置宝塔面板 Brotli压缩
- Message: session not created: This version of ChromeDriver only supports Chrome version 83
- 宝塔BT面板 设置开启TLSV1.3
- 02 复杂度分析_pythoner学习数据结构与算法系列
- 修改Mysql数据库的数据存储位置
- 使用Caddy搭建TLS1.3+HTTP2代理
- 一文带你了解Python爬虫(一)——基本原理介绍