摘要:正则表达式一直是困扰很多程序员的一门技术,当然也包括曾经的我。正则表达式的基本组成元素可以分为字符和元字符。字符很好理解,就是基础的计算机字符编码,通常正则表达式里面使用的就是数字英文字母。在正则表达式里,集合的定义方式是使用中括号和。
正则表达式一直是困扰很多程序员的一门技术,当然也包括曾经的我。大多数时候我们在开发过程中要用到某些正则表达式的时候,都会打开谷歌或百度直接搜索然后拷贝粘贴。当下一次再遇到相同问题的时候,同样的场景又再来一遍。作为一门用途很广的技术,我相信深入理解正则表达式并能融会贯通是值得的。所以,希望这篇文章能帮助大家理清思路,搞懂正则表达式各种符号之间的内在联系,形成知识体系,当下次再遇到正则表达式的时候可以不借助搜索引擎,自己解决。
正则表达式到底是什么
正则表达式(Regular Expression)其实就是一门工具,目的是为了字符串模式匹配,从而实现搜索和替换功能。它起源于上个20世纪50年代科学家在数学领域做的一些研究工作,后来才被引入到计算机领域中。从它的命名我们可以知道,它是一种用来描述规则的表达式。而它的底层原理也十分简单,就是使用状态机的思想进行模式匹配。大家可以利用regexper.com这个工具很好地可视化自己写的正则表达式:
如/dw+/这个正则生成的状态机图:
对于具体的算法实现,大家如果感兴趣可以阅读《算法导论》。
从字符出发
我们学习一个系统化的知识,一定要从其基础构成来了解。正则表达式的基本组成元素可以分为:字符和元字符。字符很好理解,就是基础的计算机字符编码,通常正则表达式里面使用的就是数字、英文字母。而元字符,也被称为特殊字符,是一些用来表示特殊语义的字符。如^表示非,|表示或等。利用这些元字符,才能构造出强大的表达式模式(pattern)。接下来,我们就来从这些基本单位出发,来学习一下如何构建正则表达式。
单个字符
最简单的正则表达式可以由简单的数字和字母组成,没有特殊的语义,纯粹就是一一对应的关系。如想在"apple"这个单词里找到‘a"这个字符,就直接用/a/这个正则就可以了。
但是如果想要匹配特殊字符的话,就得请出我们第一个元字符****, 它是转义字符字符,顾名思义,就是让其后续的字符失去其本来的含义。举个例子:
我想匹配*这个符号,由于*这个符号本身是个特殊字符,所以我要利用转义元字符来让它失去其本来的含义:
/*/
如果本来这个字符不是特殊字符,使用转义符号就会让它拥有特殊的含义。我们常常需要匹配一些特殊字符,比如空格,制表符,回车,换行等, 而这些就需要我们使用转义字符来匹配。为了便于记忆,我整理了下面这个表格,并附上记忆方式:
特殊字符 | 正则表达式 | 记忆方式 |
---|---|---|
换行符 | new line | |
换页符 | f | form feed |
回车符 | return | |
空白符 | s | space |
制表符 | tab | |
垂直制表符 | v | vertical tab |
回退符 | [] | backspace,之所以使用[]符号是避免和重复 |
多个字符
单个字符的映射关系是一对一的,即正则表达式的被用来筛选匹配的字符只有一个。而这显然是不够的,只要引入集合区间和通配符的方式就可以实现一对多的匹配了。
在正则表达式里,集合的定义方式是使用中括号[和]。如/[123]/这个正则就能同时匹配1,2,3三个字符。那如果我想匹配所有的数字怎么办呢?从0写到9显然太过低效,所以元字符-就可以用来表示区间范围,利用/[0-9]/就能匹配所有的数字, /[a-z]/则可以匹配所有的英文小写字母。
即便有了集合和区间的定义方式,如果要同时匹配多个字符也还是要一一列举,这是低效的。所以在正则表达式里衍生了一批用来同时匹配多个字符的简便正则表达式:
匹配区间 | 正则表达式 | 记忆方式 |
---|---|---|
除了换行符之外的任何字符 | . | 句号,除了句子结束符 |
单个数字, [0-9] | d | digit |
除了[0-9] | D | not digit |
包括下划线在内的单个字符,[A-Za-z0-9_] | w | word |
非单字字符 | W | not word |
匹配空白字符,包括空格、制表符、换页符和换行符 | s | space |
匹配非空白字符 | S | not space |
循环与重复
一对一和一对多的字符匹配都讲完了。接下来,就该介绍如何同时匹配多个字符。要实现多个字符的匹配我们只要多次循环,重复使用我们的之前的正则规则就可以了。那么根据循环次数的多与少,我们可以分为0次,1次,多次,特定次。
0 | 1
元字符"); 最后,欢迎大家关注我的公众号,一起学习交流。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/6649.html
摘要:对前端来说,使用的场景不多,但是像微信端的对话系统的表情包,就使用到了一个特定的规则。我是一个前端,工作年了,现在失业,想进入腾讯工作,这是我的联系方式这个正则虽 我发现有个别字符被这个编辑器给刷掉了,但是灰色区域显示正常,以灰色区域代码为准 什么玩意? 在我刚开始学习编程的时候,就听过正则了,也听说正则很牛逼,懂正则的更牛逼。但是苦于没有人指点,也没有使用正则的场景,自己看教程又懵逼...
本文收集学习过程中使用到的资源。 持续更新中…… 项目地址 https://github.com/abc-club/f... 目录 vue react react-native Weex typescript Taro nodejs 常用库 css js es6 移动端 微信公众号 小程序 webpack GraphQL 性能与监控 高质文章 趋势 动效 数据结构与算法 js core 代码规范...
摘要:可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。我工作中只用到,对和不怎么熟与的区别相同点都支持指令内置指令和自定义指令都支持过滤器内置过滤器和自定义过滤器都支持双向数据绑定都不支持低端浏览器。 看看面试题,只是为了查漏补缺,看看自己那些方面还不懂。切记不要以为背了面试题,就万事大吉了,最好是理解背后的原理,这样面试的时候才能侃侃而谈。不然,稍微有水平的面试官一看就能看出,是...
摘要:常见的关键字有等等常见的保留字有等等本文可能会直接用到的有定义一个变量在浏览器控制台或后台终端输出一个值在浏览器弹窗输出一个值基本数据类型基本类型包括数值,字符串,,和布尔型。 标识符命名规则 对于变量名,键值对中的键名应满足如下要求: 开头必须是字母、下划线(_)或美元符号($) 除了开头以外的字符也可以是数字 不可以是关键字和保留字 最好不要和全局变量/函数同名,会把原有变量/函...
阅读 2811·2021-11-24 09:39
阅读 3934·2021-10-27 14:19
阅读 2017·2021-08-12 13:25
阅读 2319·2019-08-29 17:07
阅读 1093·2019-08-29 13:44
阅读 1014·2019-08-26 12:17
阅读 441·2019-08-23 17:16
阅读 2025·2019-08-23 16:46