详情

首页手游攻略 正则表达式中问号(?)的正确用法完整指南

正则表达式中问号(?)的正确用法完整指南

佚名 2026-09-03 20:50:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“正则表达式中问号(?)的正确用法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 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');//输出true
console.log(RegExp.$1);//输出aaaa
console.log(RegExp.$2);//输出bbb

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

var testReg=/(a+)(?:b*)c/;
testReg.test('aaaabbbccc');//输出true
console.log(RegExp.$1);//输出aaaa
console.log(RegExp.$2);//输出""

4、断言

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

常用的断言有以下四种

(?=pattern)

结合项目来看,非拿到匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需拿到供以后采用。

(?!pattern)

结合项目来看,非拿到匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需拿到供以后采用。

(?<=pattern)

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

(?<!patte_n)

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

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

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

var testReg=/test(?=123)/;
var result=testReg.exec('test123');
console.log(result[0])//输出test
 
var 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])//输出test
 
var result2=testReg.exec('12test');
console.log(result2)//输出null

理解这一步时,同样(?=123)test能够匹配到123test中的test,匹配不到12test中的test,同时且匹配结果同样不包含断言

在这个场景下,对于?!pattern和?<!pattern能够看成是上面两个表达式的取反,分别匹配断言不成立时的左侧和右侧文本,具体能够看以下代码

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

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

参考资料:

(链接已移除)

(链接已移除)

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

您可能感兴趣的文章:

  • 正则表达式(?=)正向先行断言实战案例
  • 正则表达式中.+?与.*?的区别
  • 正则表达式中的 .*? 或 .*+ 的意思
  • 解析正则表达式中的.*,.*?,.+?的含义
  • 还不会正则表达式?赶快看这篇!
  • 正则表达式惰性匹配模式(?)
  • 一个正则表达式的看法(?:)
  • 正则表达式中(?s)与(?m)的区别解析

相关资讯
点击查看更多
游戏推荐
推荐专题
热门阅读
推荐下载