正则表达式入门(上)---字符组和量词
相信很多人都碰到过需要用正则匹配字符串的时候,遇到了又不会写,上网一通乱搜,也看不明白那些鬼画符是个什么意思,就当黑箱调来改去的经历。
但其实如果只是想看懂简单正则表达式的话,并没有那么困难。符号虽多,但仍有线索可寻。它的内容可以大致划分为字符组、量词、分组和断言四部分
这四个部分的表示方法都和这三个括号()
,[]
,{}
息息相关,简单的对应关系如下:
- 字符组 []
- 量词 {}
- 分组 & 断言 ()
接下来就让我们以括号为线索了解正则表达式吧
(为了方便, 文中示例使用JavaScript, 可以直接粘贴到浏览器控制台查看效果)
/bc/.test('abcd') //输出true 判断字符串'abcd'是否匹配表达式 'abc' /字符串/是js表示正则的语法
'abcd'.search(/bc/) //输出1 搜索首次匹配的位置
'abcd'.match(/bc/)[0] //输出 获取匹配到的字符串
一. 字符组 []
首先,在没有特殊符号的情况下,正则只是简单的匹配字符是否相等
比如 /b/.test('abc')
匹配字符串中的b字符
但是往往我们会需要在一个位置上匹配一类
字符,这在正则中被称为字符组,使用 中括号[] 表示
例如,需要查找字符串中是否存在数字的话,可以写作'a1'.search(/[0123456789]/) //输出1
意思是字符串’a1’中的下标为1的字符可以由表达式/[0123456789]/
匹配
但这样也有个问题,表示英文字母得把26个字母挨个敲一遍,太长了; 不过放心,正则提供了一些简写的方式
1. 字符组的简写
1.1 范围表示法
范围表示法就是以[x-y]
的形式表示x到y范围的字符,按照ASCII的顺序来
这样,[0123456789]
就可以写作[0-9]
,小写字母也就可以表示为[a-z]
1.2 字符组简记法
使用[0-9]
,[a-z]
已经可以很方便的表示数字和小写字母了,但仍然有更简单的表示,也就是简记法
比如 表示数字的 [0-9]
可以写成 \d
,d表示数字(digit); 虽然\d
这种写法并没有中括号,但它们是等价的;
下面是一些常用的简记法和其等价的字符组的对应关系
简记法 | 等价字符组 | 说明 |
---|---|---|
\d | [0-9] | 数字 digit |
\D | [^0-9] | 非数字 |
\s | [ \t\r\n\v\f] | 空白字符 |
\S | [^ \t\r\n\v\f] | 非空白字符 |
\w | [0-9a-zA-Z_] | 单词字符(字母数字下划线,包括中文) |
\W | [^0-9a-zA-Z_] | 非单词字符 |
2. 排除和转义
2.1 排除型字符组
上面的表里一二行出现了一个奇怪的现象,[0-9]
只是加了个^
,怎么就从数字变成非数字了呢?不应该表示的是十个数字加上一个^
这11个字符吗?
这个^
符号在字符组里表示 取反 ,可以很方便的表示指定字符之外的字符集合
这一概念,比如[^0-9]
可以用来形容所有非数字字符
但是这样的话 十个数字加上一个^
这11个字符 又该怎么表示呢?
其实,^
只有紧跟在左中括号后面时,才表示取反
的意思,如果改成[0-9^]
,那么它的意思就只是简单的匹配 十个数字或者^
字符了
2.2 转义字符
让取反符号^
变成普通字符并不只有更改位置这一种方式,还可以通过转义字符来实现
说到转义,首先不得不提到一个概念: 元字符 ; 这些字符不同于普通字符,它们在正则表达式中有折特殊的含义,例如 字符组[^0-9]
里面的^
和 -
,还有外层的中括号本身等;
如果就是想要匹配这些元字符本身,而不是它们所表达的特殊含义的话,可以在它们前面加上反斜杠\
,来恢复它们的本来面目.
到这里你也应该发现了,\
也是元字符,需要用\\
来表示它本身
下面是一些常见的元字符
元字符 | 作用 | 说明 |
---|---|---|
- |
范围表示法 [0-9]表示[0123456789],按照ASCII编码顺序 |
只在字符组内有效 |
^ |
排除型字符组 例: [^0-9] 匹配除数字外的其他字符
|
只有紧跟在[ 后才是元字符[12^] 匹配的是’1’ ,‘2’,’^'这三个普通字符
|
\ | 转义字符 |
匹配字符\ 本身需要\\
|
() | 分组 | |
[] | 字符组 | |
{} | 量词 |
二. 量词 {}
上面所描述的都是匹配单个字符,如果需要匹配多个,比如YYYY-MM-DD
这种格式的日期,只用\d的话是这样的\d\d\d\d-\d\d-\d\d
,很啰嗦;
正则中这种匹配多个字符的方式叫做量词,写作{n,m}
,比如4个数字是\d{4}
整个日期可以写成\d{4}-\d{2}-\d{2}
量词的一般形式为{m,n}
,用于限定{}
前面的元素出现的次数,n和m分别为出现次数的上下限(闭区间)
量词 | 说明 |
---|---|
{n} | 必须出现n次 |
{m,n} | 出现m到n次 |
{m,} | 至少出现m次,无上限 |
* | 次数无上下限 , 等价于{0,} |
+ | 至少一次,等价于{1,} |
? | 0次或1次,等价于 {0,1} |
贪婪和非贪婪模式
看到上面的表,你有没有疑惑: 如果+
意思是匹配 1到无穷次, 那么如果有很多的字符都可以匹配的话,它是按多的来还是少的来呢?
具体来说, 用\d+
匹配一段数字,是匹配全部还是只选第一个?
这里可以在控制台里尝试一下 '1234'.match(/\d+/)[0]
,会发现它匹配上了全部的1234,所以说量词默认是 贪婪 的,即尽量多的匹配能匹配上的字符
那么相对应的就有非贪婪模式(匹配尽量少的字符), 它的写法是在量词后面加上?
'1234'.match(/\d+/)[0] // 1234
'1234'.match(/\d+?/)[0] // 1
- 可以简单的理解为
- 贪婪模式下这个量词匹配尽量多的字符
- 非贪婪模式匹配尽量少的字符
有意思的是?
本身也是一种量词,两个?
连起来表示: 以非贪婪模式匹配前面的元素0或1次,考虑到要匹配尽量少的字符,那就是压根不匹配
'ab'.match(/ab?/)[0] // ?等价于量词 {0,1} , 字符b可以匹配也可以不匹配, 因为是贪婪模式,那就匹配上了
'ab'.match(/ab??/)[0] // 第一个?是量词 ,第二个? 表示非贪婪模式
参考
正则指引
正则表达式入门(上)---字符组和量词相关推荐
- 正则表达式入门之字符匹配
正则表达式入门-字符匹配 在前段时间进行文本挖掘练习的时候,不会使用正则表达式,深感不宜.所以这里,我想赶紧学习一下正则表达式. 注:本文是对<正则表达式必知必会>的复习. 1.正则表达式 ...
- 【python学习】正则表达式入门
python正则表达式入门学习 前言 今天进入python正则表达式的入门学习 学习正则表达式的初衷还是为了awd比赛做准备 (好吧,其实学习python都是为了ctf啊) 学习的目的就是为了可以提取 ...
- 快速解决正则----模糊匹配、字符类、量词
主体概要 正则表达式是什么 是匹配模式.要么匹配字符.要么匹配位置 内容 掌握字符类和量词就能解决大部分常见正则问题 关键内容:字符组.量词.贪婪.惰性.模糊.横向.纵向.分支.位置 重要的基础 ...
- javascript 学习并梳理正则表达式姿势之字符串匹配( 一)
正则表达式字符串匹配相关 引:<JavaScript 正则表达式迷你书> 读老姚丨洞见生产者的<JavaScript 正则表达式迷你书>全是干货好书,通俗易懂,图文结合 正则是 ...
- 正则表达式入门与进阶
文章目录 正则表达式入门部分 一.字符组 二.区间 三.特殊字符转义符 四.字符组取反 五.快捷方式 5.1 匹配单词字符.数字 5.2 匹配空白 5.3 匹配单词边界 5.4.快捷方式取反 5.5. ...
- 【正则表达式系列】一些概念(字符组、捕获组、非捕获组)
前言 本文介绍一些正则中的常用名词以及对应概念,譬如字符组,捕获组.非捕获组.反向引用.转义和\s \b等 大纲 字符组 捕获组 反向引用 非捕获组 ..\s和\S \b \转义 字符组 []字符组表 ...
- python正则表达式入门教程括号及字符
数据分析遇到字符串处理会有两个阶段涉及到正则表达式,一个是在数据库阶段一个是Python处理阶段.作为一个小白学习正则也遇到很多弯路和难理解的点,今天就梳理梳理学习的过程. hive里面正则表达式可以 ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- python正则表达式快速入门_Python学习笔记——正则表达式入门
标签: # 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: ...
- java正则任意字符_正则表达式匹配任意字符(包括换行符)的写法
今天在Java中想使用正则表达式来获取一段文本中的任意字符.于是很随意得就写出如下匹配规则: (.*) 结果运行之后才发现,无法获得换行之后的文本.于是查了一下手册,才发现正则表达式中,". ...
最新文章
- 数据结构之shell排序
- 获取请求url的查询字符串
- 【quickhybrid】架构一个Hybrid框架
- jQuery中通过JSONP来跨域获取数据的三种方式
- 不区分大小写的内容比较
- Mac下Sublime text2中文乱码问题的解决
- JavaScript:动态选中CheckBox
- C语言return关键字
- 绝对布局优势_前瞻布局+尖端科技+雄厚资金 恒大解锁造车的“正确姿势”
- 求二叉树节点个数、叶子节点、节点层次与宽度
- wrapper php,PHP流Streams、包装器wrapper概念与用法实例详解
- python在windows 输入和输出文件_Python文件、目录和输入输出操作
- JS:callee属性
- 图书管理系统数据库设计实验报告
- mysql ddl脚本_MySQL在线DDL gh-ost使用总结
- 关于《完全用Linux工作》的思考
- 微信小程序 app.wxss css 不生效
- VR学习(Demo)以及在Unity3D上的项目
- sklearn.svm.SVC的方法decision_function_shape:ovr 或者 ovo
- SSL协议和SET协议
热门文章
- matlab泰勒展开样例,MATLAB绘图样例
- linux下安装配置dble--新手入门
- c++最大公因数与最小公倍数求法
- 学GIS的你,是时候自己做张中国地图了(附行政区划数据下载)
- 微信订阅号获取openid
- 贵州等保测评机构工程师(DJCP)目录-贵州等级保护测评机构工程师名单
- matlab中wavread函数,关于wavread函数的用法
- t430服务器查看raid状态,dell t430 raid1教程
- nas智能家居服务器,智能家居 | 群晖NAS,你的智能生活中心 Vol.1
- 【微信篇】电脑版微信的照片视频文件位置变化