首页 热点 业界 科技快讯 数码 电子消费 通信 前沿动态 电商

正则表达式中问号(?)的正确用法详解

2022-05-17 08:39:58 来源 : 软件开发网

目录

1、直接跟随在子表达式后面

2、非贪婪匹配

3、非获取匹配

4、断言

参考资料:

正则表达式中“?”的用法大概有以下几种

1、直接跟随在子表达式后面

这种方式是最常用的用法,具体表示匹配前面的一次或者0次,类似于{0,1},如:abc(d)?可匹配abc和abcd

2、非贪婪匹配

关于贪婪和非贪婪,贪婪匹配的意思是,在同一个匹配项中,尽量匹配更多所搜索的字符,非贪婪则相反。正则匹配的默认模式是贪婪模式,当?号跟在如下限制符后面时,使用非贪婪模式(*,+,?,{n},{n,},{n,m})

如正则表达式 \S+c 匹配字符串aaaacaaaaaaac的结果是aaaacaaaaaaac,而\S+?c则会优先匹配aaaac

3、非获取匹配

当我们使用正则表达式的时候,捕获的字符串会被缓存起来以供后续使用,具体表现为每个()中的表达式所匹配到的内容在进行正则匹配的过程中,都会被缓存下来,如以下代码

var testReg=/(a+)(b*)c/;testReg.test("aaaabbbccc");//输出trueconsole.log(RegExp.$1);//输出aaaaconsole.log(RegExp.$2);//输出bbb

但是,如果在子分组中加入?:之后,分组依然成立,但是不会被缓存下来,看以下代码

var testReg=/(a+)(?:b*)c/;testReg.test("aaaabbbccc");//输出trueconsole.log(RegExp.$1);//输出aaaaconsole.log(RegExp.$2);//输出""4、断言

我们知道,正则表达式中大部分的结构所匹配的文本最终会出现在匹配结果中,但也有一部分结构并不真正匹配文本,而只是负责判断某个位置左/右侧是否符合要求,这种结构被称为断言

常用的断言有以下四种

(?=pattern)

非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。

(?!pattern)

非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。

(?<=pattern)

非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。

(?

非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。

以下的段落中,我们将统一使用pattern表示断言的条件

?=pattern和?<=pattern分别表示匹配断言成立时左侧和右侧的文本,只有断言成立了,左侧或右侧的文本才会被匹配,但断言所匹配的结果并不会出现在匹配结果中,具体例子可以看以下代码

var testReg=/test(?=123)/;var result=testReg.exec("test123");console.log(result[0])//输出testvar result2=testReg.exec("test12");console.log(result2)//输出null

我们可以看到test(?=123)可以匹配到test123中的test,但是并不能匹配test12中的test,对于?<=pattern同理,可以看以下代码

var testReg=/(?<=123)test/;var result=testReg.exec("123test");console.log(result[0])//输出testvar result2=testReg.exec("12test");console.log(result2)//输出null

同样(?=123)test可以匹配到123test中的test,匹配不到12test中的test,并且匹配结果同样不包含断言

对于?!pattern和?var testReg=/test(?!123)/;var result=testReg.exec("test123");console.log(result)//输出nullvar result2=testReg.exec("test12");console.log(result[0])//输出testvar testReg=/(?

如上我们可以看到这个时候要匹配到左侧或者右侧的test,需要括号里的断言不成立时,才能匹配的到了

参考资料:

https://blog.csdn.net/u014762221/article/details/68953155

https://www.jianshu.com/p/08c2fa742c1b

到此这篇关于正则表达式中问号(?)的正确用法详解的文章就介绍到这了,更多相关正则表达式中问号内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!

标签: 正则表达式 子表达式 参考资料

相关文章

最近更新
观焦点:超萌相机 2023-03-01 12:29:37
海南百货网 2023-03-01 12:13:44
焦点热讯:宜点充 2023-02-28 10:10:16
天天关注:小铺CEO 2023-02-28 10:07:13
【世界聚看点】KaFit 2023-02-28 09:31:37
葱天下 2023-02-28 09:17:03
渔界竞钓 2023-02-28 08:15:29
焦点快看:鲸奇视频 2023-02-28 06:30:37
环球热议:萝小逗 2023-02-27 23:25:49
简讯:小码公交 2023-02-27 23:16:12
彼岸花 2023-02-27 22:32:52
时时夺宝 2023-02-27 21:37:50
天天动态:袜之源 2023-02-27 21:29:50
天天资讯:AI空气 2023-02-27 20:19:46
世界时讯:绘读 2023-02-27 20:19:41
看点:一元得购 2023-02-27 19:26:28