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

正则表达式详解

时间:2019-08-28 13:21:47  来源:  作者:

什么是正则?

正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来按照“给定模式”匹配文本。比如,正则表达式给出一个 Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址。JAVAScript 的正则表达式体系是参照 Perl 5 建立的。

建立正则表达式

使用内置RegExp构造函数

var reg=new RegExp("martin");

直接建立

var reg=/martin/;

以上两种建立正则的方式是等效的,,不过一般第二种方式用的更多一些。

接受参数

正则表达式除了接受一个字面量字符参数,还可以接受一个修饰符作为参数。

var reg=/martin/g
//var reg=new RegExp("martin","g");

说完基本的正则概念和接受参数,接下来说一下正则的匹配规则,这一块也是面试和笔试考察的重点。

匹配规则

在说匹配规则之前我们先说一下正则中的字符分类。

字面量字符和元字符

字面量字符:只表示它字面的含义,就像上面代码中的martin,也就是实际用于匹配的字符。

元字符:不代表字符本身字面的意思,而是有特殊含义的字符,也就是帮助字面量字符达到更好的匹配效果的辅助字符。

其中元字符又分为很多类,具体类型如下:

正则表达式详解

元字符分类

  • 点字符(.)
var reg=/1.3/; //表示匹配1和3之间包含任意一个字符的情况,除特殊符外,如:"1-3","1.3","123"等;
 //但是一个点只能匹配一个字符,如:"1223"则无法匹配成功
  • 位置字符(^和$)
var reg=/^13/; //表示以"13"字符串开头的字符串
reg.test("134") //true
var reg=/13$/; //表示以"13"字符串结束的字符串
reg.test("134") //false
reg.test("4 31") //true
var reg=/^13$/; //注意:表示从开始到结束位置只有"13"这个字符串
reg.test("13") //true
reg.test("1313") //false

注意: /^13$/ 这个正则表达式很容易让人理解成匹配以字符串"13"开始和结尾的字符串,如:"1313",但实际上它是表示从开始到结束位置只有"13"这个字符串。

  • 选择符(|)
var reg=/11|22||33/; //表示匹配"11"或者"22"或者"33"
reg.test("11") //true
reg.test("22") //true

注意:选择符会匹配包括它前后的多个字符,比如 /11|22/ 指的是匹配"11"或者"22",而不是指匹配1或者2,。如果想匹配1或者2,可以添加括号来实现,如:

var reg=/1(1|2)2/;
reg.test("112") //true
reg.test("122") //true

转义字符

如果要在正则表达式中使用具有特殊含义的字符,如:$,^等,也就是如果要匹配它们本身,那就需要用到转义字符了,也就是在他们前面加上""反斜杠,比如要匹配$,则写成$。

正则表达式中,需要反斜杠转义的,一共有12个字符:^、.、[、$、(、)、|、*、+、?、{和\。需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。

.

var reg=/1$/; //表示匹配字符串"1$",而不是以1结尾的字符串
reg.test("1") //false
reg.test("1$") //true

特殊字符

正则表达式对一些不能打印的特殊字符,提供了表达方法。

  • cX 表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符。
  • [b] 匹配退格键(U+0008),不要与b混淆。
  • n 匹配换行键。
  • r 匹配回车键。
  • t 匹配制表符 tab(U+0009)。
  • v 匹配垂直制表符(U+000B)。
  • f 匹配换页符(U+000C)。
  • 匹配null字符(U+0000)。
  • \xhh 匹配一个以两位十六进制数(\x00-\xFF)表示的字符。
  • \uhhhh 匹配一个以四位十六进制数(\u0000-\uFFFF)表示的 Unicode 字符。

字符类

字符类表示有一系列字符可供选择,只要匹配其中一个就可以。表示方法为将所有可供选择的字符都放在方括号内,比如[xyz]表示匹配x、y、z中的任意一个就可以。

var reg=/[abc]/; //表示匹配a,b,c中任一字符皆可
reg.test("hello") //false
reg.test("Apple") //true

说到这里同学们应该会想到之前说过的选择符吧,[xyz]就等效于(x|y|z),两者可相互转换。

Q:那既然两种字符功能可以相互转换,为啥有了选择符还要字符类呢?

A:因为字符类除了能表示选择,还包括另外两种字符,脱字符和连字符,这两种字符又有新的功,可以将字符类理解成选择符的一种超集。

  • 脱字符(^)

表示可以匹配除字符类中字符以外的所有字符,因为这个符号和位置字符中的"^"开始位置字符是相同的,所以在使用时要注意区别,直接"^"放在正则表达式开头的是位置字符,放在"[]"中开头的"^"表示的是脱字符。

var reg=/^123/; //位置字符
reg.test("1234"); //true
var reg=/[^123]/; //脱字符
reg.test("123"); //false
reg.test("4") //true
  • 连字符(-)

表示匹配连续字符序列中的任意一个字符,如:[abcdef]可以写成[a-f],[012345678]可以写成[0-9]等,这大大提升了字符类书写的简便性。

var reg=/0-9/; //表示匹配字符串"0-9"
reg.test("0") //false
reg.test("0-9")//true
var reg=/[0-9]/;
reg.test("0") //false

==注意:虽然连字符用起来十分简便,但是一定要避免过度使用连字符,因为连字符往往设定的是一个比较大的范围,如果不注意可能会匹配到意料之外的一些字符。比如:[A-z],表面上它是要匹配到A-Z和a-z这52个字符,但是实际上在ASCII编码中,在Z和a之间还有很多其他字符,所以可能机会出现意料之外的匹配效果。

var reg=/[A-z]/;
reg.test('['); //true

分析:因为"["字符在Z和a之间,所以也能被匹配到。

预定义模式

预定义模式是指某些常见模式的简写方式,可以理解成是内置的正则表达。

  • d 匹配0-9之间的任一数字,相当于[0-9]。
  • D 匹配所有0-9以外的字符,相当于[^0-9]。
  • w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。
  • W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。
  • s 匹配空格(包括换行符、制表符、空格符等),相等于[ trnvf]。
  • S 匹配非空格的字符,相当于[^ trnvf]。
  • b 匹配词的边界。
  • B 匹配非词边界,即在词的内部。

重复类

模式的精确匹配次数,使用大括号({})表示。{n}表示恰好重复n次,{n,}表示至少重复n次,{n,m}表示重复不少于n次,不多于m次,默认匹配的是单个字符,若想要重复字符串,可以使用括号。

var reg=/12{2,5}3/; //默认表示匹配单个字符"2"的次数为2-5次
reg.test("1223") //true 
reg.test("12123") //false
var reg=/(12){2,5}3/; //表示匹配字符串"12"的次数为2-5次
reg.test("1223") //false 
reg.test("12123") //true

量词符

量词符是内置用来设定某个模式出现的次数的,默认也是匹配单个字符的次数。

  • ? 问号表示某个模式出现0次或1次,等同于{0, 1}。
  • * 星号表示某个模式出现0次或多次,等同于{0,}。
  • + 加号表示某个模式出现1次或多次,等同于{1,}。

贪婪和非贪婪模式

  • 贪婪模式(默认):即最大可能匹配,匹配直到下一个字符不满足匹配规则为止,上面说的三个量词符,默认模式都为贪婪模式。
var s = 'aaa';
var reg=/a+/;
s.match(reg); //["aaa"]
  • 非贪婪模式:即最小可能匹配,匹配到一个满足匹配规则的字符就停止,将贪婪模式改为非贪婪模式只需要在量词符后面加一个问号。
var s = 'aaa';
var reg=/a+?/;
s.match(reg); //["a"]

总结:

  • *?:表示某个模式出现0次或多次,匹配时采用非贪婪模式。
  • +?:表示某个模式出现1次或多次,匹配时采用非贪婪模式。

修饰符

修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部,有g,i,m三种修饰符。

修饰符可以单个使用,也可以多个一起使用。

// 单个修饰符
var reg = /test/i;
// 多个修饰符
var reg = /test/ig;
  • g修饰符

默认情况下,第一次匹配成功后,正则对象就停止向下匹配了。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。

var s = 'aaa';
var reg=/a+?/;
s.match(reg); //["a"]
var s = 'aaa';
var reg=/a+?/g;
s.match(reg); //["a","a","a"]
  • i修饰符

默认情况下,正则对象区分字母的大小写,加上i修饰符以后表示忽略大小写(ignorecase)

var s = 'Aaa';
var reg=/a/;
s.match(reg); //["a"]
var s = 'Aaa';
var reg=/a/i;
s.match(reg); //["A"]
  • m修饰符

m修饰符表示多行模式(multiline),会修改^和$的行为。默认情况下(即不加m修饰符时),^和$匹配字符串的开始处和结尾处,加上m修饰符以后,^和$还会匹配行首和行尾,即^和$会识别换行符(n)。

var s = 'abn ab';
var reg=/ab$/m;
s.match(reg); //["ab"]
var s = 'abn ab';
var reg=/ab$/gm;
s.match(reg); //["ab","ab"]会按行进行匹配,会识别n换行符,这里的第一行以ab结尾,第二行也以ab结尾

练习题

1.常用的11位手机号码验证的正则?

2.常用的邮箱验证的正则?



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)  加入收藏
“代码胜于雄辩。”——林纳斯·托瓦兹(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)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
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)  加入收藏
最新更新
栏目热门
栏目头条