您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

什么是正则表达式?

时间:2019-06-27 09:26:09  来源:  作者:

正则表达式是很多程序员,甚至是一些有了多年经验的开发者薄弱的一项技能。大家都很多时候都会觉得正则表达式难记、难学、难用,但不可否认的是正则表达式是一项很重要的技能,所有我将学习和使用正则表达式时的关键点整理如下,供大家参考。

看完就懂系列之正则表达式(值得收藏)

 

什么是正则表达式?

正则表达式(Regular Expression 或 Regex),是用于定义某种特定搜索模式的字符组合。正则表达式可用于匹配、查找和替换文本中的字符,进行输入数据的验证,查找英文单词的拼写错误等。

调试工具

下面列出了几款优秀的在线调试工具,如果你想创建或者调试正则表达式可能会需要。个人比较偏好Regex101,regex101 支持在正则表达式的不同 flavor 之间切换、解释你的正则表达式、显示匹配信息、提供常用语法参考等功能,非常强大。

Regex101

看完就懂系列之正则表达式(值得收藏)

 

Regexr

看完就懂系列之正则表达式(值得收藏)

 

Regexpal

看完就懂系列之正则表达式(值得收藏)

 

开始

JAVAscript 中,一个正则表达式以 / 开头和结尾,所以简单至 /hello regexp/ 就是一个正则表达式。

Flags(标志符或修饰符)

Flags 写在结束的/之后,可以影响整个正则表达式的匹配行为。常见的 flags 有:

  1. g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配
  2. i:忽略大小写(case-insensitive);在匹配时忽略英文字母的大小写
  3. m:多行匹配(multiline);将开始和结束字符(^和$)视为在多行上工作,即分别匹配每一行(由 或 分割)的开始和结束,而不只是只匹配整个输入字符串的最开始和最末尾处

Flags 可以组合使用,如:

看完就懂系列之正则表达式(值得收藏)

 

Character Sets(字符集合)

用于匹配字符集合中的任意一个字符,常见的字符集有:

  1. [xyz]:匹配 "x"或"y"`“z” `
  2. [^xyz]:补集,匹配除 "x" "y" "z"的其他字符
  3. [a-z]:匹配从 "a" 到 "z" 的任意字符
  4. [^a-n]:补集,匹配除 "a" 到 "n" 的其他字符
  5. [A-Z]:匹配从 "A" 到 "Z" 的任意字符
  6. [0-9]:匹配从 "0" 到 "9" 的任意数字

比如匹配所有的字母和数字可以写成:/[a-zA-Z0-9]/ 或者 /[a-z0-9]/i。

Quantifiers (量词)

在实际使用中,我们常常需要匹配同一类型的字符多次,比如匹配 11 位的手机号,我们不可能将 [0-9] 写 11 遍,此时我们可以使用 Quantifiers 来实现重复匹配。

  1. {n}:匹配 n 次
  2. {n,m}:匹配 n-m 次
  3. {n,}:匹配 >=n 次
  4. ?:匹配 0 || 1 次
  5. *:匹配 >=0 次,等价于 {0,}
  6. +:匹配 >=1 次,等价于 {1,}

Metacharacters(元字符)

在正则表达式中有一些具有特殊含义的字母,被称为元字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。

常见的元字符有:

  1. d:匹配任意数字,等价于 [0-9]
  2. D:匹配任意非数字字符;d 的补集
  3. w:匹配任意基本拉丁字母表中的字母和数字,以及下划线;等价于 [A-Za-z0-9_]
  4. W:匹配任意非基本拉丁字母表中的字母和数字,以及下划线;w 的补集
  5. s:匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格
  6. S:匹配一个非空白符;s的补集
  7. :匹配一个零宽单词边界,如一个字母与一个空格之间;例如,/no/ 匹配 "at noon" 中的 "no",/ly/ 匹配 "possibly yesterday." 中的 "ly"
  8. B:匹配一个零宽非单词边界,如两个字母之间或两个空格之间;例如,/Bon/ 匹配 "at noon" 中的 "on",/yeB/ 匹配 "possibly yesterday." 中的 "ye"
  9. :匹配一个水平制表符(tab)
  10. :匹配一个换行符(newline)
  11. :匹配一个回车符(carriage return)

Special Characters (特殊字符)

正则中存在一些特殊字符,它们不会按照字面意思进行匹配,而有特殊的意义,比如前文讲过用于量词的?、*、+。其他常见的特殊字符有:

  1. :转义字符,可以将普通字符转成特殊字符。比如 w;也可以将特殊字符转成字面意思,比如 + 匹配 "+"
  2. .:匹配任意单个字符,但是换行符除外: , , 或 ;在字符集中([.]),无特殊含义,即表示 '.' 的字面意思
  3. |:替换字符(alternate character),匹配 | 前或后的表达式。比如需要同时匹配 "bear" 和 "pear",可以使用 /(b|p)ear/ 或者 /bear|pear/;但是不能用 /b|pear/,该表达式只能匹配 "b" 和 "pear"
  4. ^:匹配输入的开始。比如,/^A/ 不匹配 "an Apple" 中的 "A",但匹配 "An apple" 中的 "A"
  5. $:匹配输入的结尾。比如,/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"。^ 和 $ 在表单验证时常需要使用,因为需要验证从开始到结尾的一个完整输入,而不是匹配输入中的某一段

Groups(分组)

  1. (xyz):捕获分组(Capturing Group),匹配并捕获匹配项;例如,/(foo)/ 匹配且捕获 "foo bar." 中的 "foo"。被匹配的子字符串可以在结果数组的元素 [1], …, [n] 中找到,或在被定义的 RegExp 对象的属性 $1, …, $9 中找到
  2. (?:xyz):非捕获分组(Non-capturing Group),匹配但不会捕获匹配项;匹配项不能再次被访问到
  3. :n 是一个正整数,表示反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串;例如,/apple(,)sorange/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"

Assertion(断言)

  1. x(?=y):仅匹配被y跟随的x;例如,/bruce(?=wayne)/,如果"bruce"后面跟着wayne,则匹配之。/bruce(?=wayne|banner)/ ,如果"bruce"后面跟着"wayne"或者banner,则匹配之。但是,"wayne" 和 "banner" 都不会在匹配结果中出现
  2. x(?!y):仅匹配不被y跟随的x;例如,/d+(?!.)/ 只会匹配不被 "." 跟随的数字。
/d+(?!.)/.exec('3.141')` 匹配 `"141"`,而不是 `"3.141"

最后,推荐大家使用Fundebug,一款很好用的 BUG 监控工具~

应用

上面罗列出了这么多正则表达式的语法和规则,可以在一定程度上帮助我们分析和理解一段正则表达式的作用,但是如何将这些规则组合并创造出有特定作用的表达式还需要我们自己多加练习,下面举几个例子来说明运用这些规则。

1. 匹配手机号码

我们先从比较简单的匹配手机号码开始。目前国内的手机号码是1(3/4/5/7/8)开头的 11 位数字,因此手机号码的正则可以分解为以下几部分:

  1. 以 1 开头:/^1/
  2. 第 2 位为3、4、5、7、8中的一个:/[34578]/ 或 /(3|4|5|7|8)/
  3. 剩余 3-11 位均为数字,并以数字结尾:/d{9}$/

组合起来即为 /^1[34578]d{9}$/ 或 /^1(3|4|5|7|8)d{9}$/,因为使用捕获括号存在性能损失,所以推荐使用第一种写法。

2. 匹配电子邮件

标准的电子邮件组成为 <yourname>@<domain>.<extension><optional-extension>,

每部分的格式标准为(进行了相应的简化,主要为展示如何书写正则):

  1. yourname:任意英文字母(a-z/A-Z)、数字(0-9)、下划线(_)、英文句点(.)、连字符(-),长度大于 0
  2. domain:任意英文字母(a-z/A-Z)、数字(0-9)、连字符(-),长度大于 0
  3. extension:任意英文字母(a-z/A-Z),长度 2-8
  4. optional-extension:"."开头,后面跟任意英文字母(a-z/A-Z),长度 2-8,可选

每部分的正则表达式为:

  1. yourname:/[a-zd._-]+/
  2. domain:/[a-zd-]+/
  3. extension: /[a-z]{2,8}/
  4. optional-extension:/(.[a-z]{2,8})?/

组合起来形成最后的正则表达式:/^([a-zd._-]+)@([a-zd-]+).([a-z]{2,8})(.[a-z]{2,8})?$/;为了增加可读性可以将每部分用"()"包起来,并不要忘记起始和结束符 ^$。



Tags:正则表达式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  Tags: 正则表达式  点击:(2)  评论:(0)  加入收藏
1. 什么是正则表达式正则表达式(Regular Expressions),也称为 “regex” 或 “regexp” 是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,这样程序就可以将该模...【详细内容】
2021-11-26  Tags: 正则表达式  点击:(25)  评论:(0)  加入收藏
写在前面我们在日常的Java开发中,经常需要处理一些字符串,这个时候正则表达式是非常有用的。几乎在所有的编程语言中都支持正则表达式。以下我将压箱底多年的干货搬出来给大家...【详细内容】
2021-10-25  Tags: 正则表达式  点击:(28)  评论:(0)  加入收藏
正则作为处理字符串的一个实用工具,在Python中经常会用到,比如爬虫爬取数据时常用正则来检索字符串等等。正则表达式已经内嵌在Python中,通过导入re模块就可以使用,作为刚学Pyth...【详细内容】
2021-08-31  Tags: 正则表达式  点击:(77)  评论:(0)  加入收藏
打算给闺女买几本书,计划是列一个书单让闺女自己选。于是找到另一个还算不错的书单介绍页,可惜它不让复制,鼠标右键选中提示扫码以后就跳到学而思的网页让加老师的微信之类的。...【详细内容】
2021-08-10  Tags: 正则表达式  点击:(84)  评论:(0)  加入收藏
正则表达式到底是个啥?在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录...【详细内容】
2021-04-27  Tags: 正则表达式  点击:(243)  评论:(0)  加入收藏
作者:mathe,腾讯QQ音乐前端开发工程师正则表达式具有伟大技术发明的一切特点,它简单、优美、功能强大、妙用无穷。对于很多实际工作来讲,正则表达式简直是灵丹妙药,能够成百倍地...【详细内容】
2021-02-24  Tags: 正则表达式  点击:(198)  评论:(0)  加入收藏
概述正则表达式非常强大,能够解决我们开发时用于匹配一些特定的要求。并且java中还提供了相当强大的方法,扩展其功能性。下面我们就来介绍一下:1.定义一个关于用户名的正则表达...【详细内容】
2020-08-11  Tags: 正则表达式  点击:(68)  评论:(0)  加入收藏
“代码胜于雄辩。”&mdash;&mdash;林纳斯&middot;托瓦兹(Linus Torvalds)许多编程语言和操作系统都支持正则表达式(regular expression):定义搜索模式的一组字符串。正则表达式可...【详细内容】
2020-07-14  Tags: 正则表达式  点击:(37)  评论:(0)  加入收藏
正则表达式 - 语法正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的...【详细内容】
2020-07-05  Tags: 正则表达式  点击:(53)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条