猫史档案馆


正则表达式教程:揭开JS神秘字符/的面纱

用户:PlumStevenPlumSteven查看:1 回复:6 评论:1 创建时间:2023-01-12T22:45:21


众所周知啊,BOX的代码编辑器里面有很多颜色

有关键字的蓝色,数字的淡绿色,标识符的白色

还有这个。。。神秘的紫色:

/123456789/

那这个是啥勒?大家猜一猜

注释?数字?

都不是!这个是正则表达式!

有些人可能会问:哎不是,正则表达式是什么东西啊?

就是这个东西(网上随便找的一段):

/^[a-z]*[^\d]{1,10}?(aaa|bbb)(?:ccc)$/

好家伙,是不是直接看不懂了?没错,这就是正则的一大特点:没学过的完全看不懂!

那我们就踏上旅程,开始探索正则的世界吧!

 

一、初识正则

假设你接到了一个任务,让你用JS写一段代码,判断输入字符串是不是一个电话号码,如果是,输出yes,反之,输出no

你会咋办?狂写一堆if?(你们可以去自己试试)

注意哦,手机号有这几个特征:

第一位肯定是1

第二位大多数是3, 5, 6, 8(暂时我们先写这几个,应该还有其他的)

其他位肯定是一个数字

位数肯定是11位

 

写完这么多if之后,是不是感觉手要麻了,那用正则咋写嘞?

var regex = /1[3568]\d{9}/

啊没错就是这么简单,我们来测试一下:

//注:这里输出的是匹配到的字符串并没有输出yes和no
var regex = /1[3568]\d{9}/
var phone1 = "13123123"  //应该是错误的,输出null
var phone2 = "13123456789" //应该是正确的,输出13123456789
var ans1 = phone1.match(regex)
var ans2 = phone2.match(regex)
world.say(ans1)
world.say(ans2)

是不是很简单?我们来看一下这个正则表达式

/1[3568]\d{9}/

 

首先呢,两个/不用多说吧,就是表示这里面的东西是个正则表达式

 

基础知识:

单一字符:写啥匹配啥

比如

/abc/ 就能匹配abc

/asdf/ 就能匹配asdf

以此类推

中括号:里面有啥都可以

如:

/[abcd]/ 意思就是第一个字符你可以是a可以是b可以是c可以是d

/[ab][cd]/ 这个意思呢就是第一个字符可以是a或者b,第二个字符可以是c或者d

也就是中括号里有啥,他就能匹配啥

 

这两个就是正则最基础的知识啦,来个小练习吧

答题:/a[cd][acd]b/的意思是什么

二、深入正则

上面我们学习了单一字符匹配和万能的中括号

但是有同学就要问了,哎呀我想匹配abcdefg等等所有字符,难道要一个个打出来吗?

当然不用啦,正则怎么可能这么无情

接下来呢,我们就要开始学习一些转义字符center_image

 

上面的我们基本不用看,平常不会用到,我们重点看\w到\D部分,这些就是我们最常用的东西啦!

正如大家所见,\d可以匹配数字字符,比如/\d/就可以匹配第一个字符是0123456789的字符串

而\D呢,就是匹配非数字字符,也就是说/\D/可以匹配第一个字符不是0123456789的字符串

这不就是变成大写意思反过来吗?

\w,\s,\b也就同理啦,大家可以自行去看,这里不多赘述

 

量词

什么?正则也有量词?

没错,就是我们平常说的“三个苹果“中的”个“

正则里面的量词有一堆,我们先学习这个

大括号——重复匹配多次

这个很好理解,比如/a{3}/就可以匹配aaa,因为大括号里是三,重复匹配三次吗

而{m,n}这种写法呢,就是匹配m~n次(优先n次,这个不用多管),比如/a{1,3}/就可以匹配一个a,两个a或者3个a(即a, aa, aaa)

还有一个{m,},即匹配m~∞次(优先∞次),/a{1,}/就可以匹配a,aa,aaa,aaaa,aaaaa,aaaaaa......

问号:是或者不是

问好也就是匹配一次或者不匹配,或者说0次,优先匹配1次,相当于是{0,1}

/ab?/就可以匹配a或者ab

然后他加在大括号后面可以开启非贪婪模式,即优先匹配小的数字

加号和星号:一堆好兄弟

这俩玩意完全就是{}的简便写法

+表示{1,}

*表示{0,}

这就是量词啦

 

运算符(我自己取的名字)

^ :可以表示一个正则表达式的开始(当然也可以不写,但你写了最好得在后面加个$,表示结束)

    也可以表示非(比如[^abc]表示匹配除了abc之外的所有字符

|  :表示或者

比如abc|efg可以匹配abc或者efg

 

三、giao级方法

分组

说难听点就是运算优先级,和Python一样

比如abc{2}本来可以匹配abcc,但是如果加上圆括号

(abc){2},就表示abc是个整体,要匹配abcabc

注:不能在中括号中使用

 

最后说说JS里面怎么用吧

平常我们都会用 字符串.match()方法

注意了,match表示匹配,/asdf/是可以匹配asdff的,因为asdff里面有一个asdf

还有search和replace方法,大家自行去了解吧

 

撒花撒花,本教程就到这里啦!拜拜


回复

上一页1 页 / 共 1下一页
PlumStevenPlumSteven

我倒是把这里没讲清楚的重新补充一遍,昨天晚上太急了

点赞0


评论


小张awa小张awa

我有一个小问题:运算符如何匹配?

点赞0


评论


limit_breakrlimit_breakr

吸汁水中()

点赞0


评论


limit_breakrlimit_breakr

var regexp = new Regexp
var regexp = q/[e,q]/

//可以说是字符快捷操作工具,避免N个for嵌套

点赞0


评论


PlumStevenPlumSteven

注意了注意了

补充几个点

中括号里面不仅仅可以写\w,如果你想要用a-c,1-6这种区间范围的话,可以用[a-c],[1-6],以此类推

然后关于转义字符,有人问我怎么匹配操作符(比如括号啊,加号啊等等)

只需要用反斜杠\加上你想匹配的字符(比如\+,\*,\(等)就可以啦

$()*+.[]?\^{}|, -好像都需要转义

点赞0


评论


AokenAoken

点赞1


评论