正则表达式⾥问号?的⽤法
⽂章原⽂:
1.普通的问号符号
因为?是特殊符号,所以如果想把?当做正常的问号匹配,就需要加转义\?
⽰例
var regex = /123\?456/
var str = '123?456'
2.量词
问号可以表⽰重复前⾯内容的0次或⼀次,也就是要么不出现,要么出现⼀次
⽰例
var regex = /1?23/
3.惰性模式匹配
量词模式是贪婪模式,在量词后⾯加上问号,就变成了惰性匹配
看如下量词的表格
模式说明
{n,m}连续出现 n 到 m 次。贪婪模式
{n,}⾄少连续出现 n 次。贪婪模式
{n}连续出现 n 次。贪婪模式
等价于 {0,1}。贪婪模式
+等价于 {1,}。贪婪模式
*等价于 {0,}。贪婪模式
量词后⾯加上问号后如下
模式说明
--------
{n,m}?连续出现 n 到 m 次。惰性模式
{n,}?⾄少连续出现 n 次。惰性模式
{n}?连续出现 n 次。惰性模式
等价于 {0,1}?。惰性模式
+?等价于 {1,}?。惰性模式
*?等价于 {0,}?。惰性模式
贪婪模式跟惰性模式的区别
1. 贪婪匹配是先看整个字符串是否匹配,如果不匹配,它会去掉字符串的最后⼀个字符,并再次尝试,如果还不匹配,那么再去掉当前
最后⼀个,直到发现匹配或不剩任何字符。
2. 惰性匹配是从左侧第⼀个字符开始向右匹配, 先看第⼀个字符是不是⼀个匹配, 如果不匹配就加⼊下⼀个字符再尝式匹配, 直到发现匹配4.⾮捕获性分组
1. 正常只使⽤括号就是捕获模式,可以捕获括号⾥的数据,保存在内存中,所以捕获模式会占⽤更多内存
2. ⾮捕获模式,就是在⾥⾯的最前⾯加:
⽰例
RegExp 会保存分组⾥的数据, 如下所⽰
var regex = /(\d{4})-(\d{2})-(\d{2})/
RegExp.$1 // "2011"
RegExp.$2 // "11"
正则匹配问号RegExp.$3 // "12"
使⽤?:的分组就是⾮捕获模式,RegExp 不会保存该分组的数据,如下所⽰
var regex = /(?:\d{4})-(\d{2})-(?:\d{2})/
RegExp.$1 // "11"
RegExp.$2 // ""
5.断⾔
1.正先⾏断⾔(前瞻)
(?=X)
2.负先⾏断⾔(前瞻)
(?!X)
3.正后发断⾔(后顾)
(?<=X)
4.负后发断⾔(后顾)
(?<!X)
语法说明
(?=X )正先⾏断⾔。仅当⼦表达式 X 在此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,⽽不与该数字匹配。此构造不会回溯
(?!X)负先⾏断⾔。仅当⼦表达式 X 不在此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,⽽不与该数字匹配
(? <=X)正后发断⾔。仅当⼦表达式 X 在此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后⾯的 99 的实例匹配。此构造不会回溯
(?<!X)负后发断⾔。仅当⼦表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后⾯的 99 的实例匹配简单来说,前瞻就是看后⾯等于(?=), 后⾯不等于(?!), 后顾就是前⾯等于(?<=), 前⾯不等于(?<!)
⽐如 (?<!AA)eat(?=milk) 表⽰, eat 前⾯不能是AA,后⾯必须是 milk
⽐如 (?<=AA)eat(?!milk) 表⽰ eat 前⾯必须是AA,后⾯不能是milk
⽰例
let str1 = "VVeatmilk"
let str2 = "AAeatfood"
let patt1 = new RegExp("(?<!AA)eat(?=milk)");
let patt2 = new RegExp("(?<=AA)eat(?!milk)");
let result1 = st(str1);
let result2 = st(str2);
console.log(result1) // true
console.log(result2) // true
以(?=p) 和 (?!p)为例
(?=p),其中 p 是⼀个⼦模式,即 p 前⾯的位置,或者说,该位置后⾯的字符要匹配 p
⽐如(?=l),表⽰l字符前⾯的位置,例如:
var result = "hello".replace(/(?=l)/g, '#');
console.log(result);
// => "he#l#lo"
⽽ (?!p) 就是 (?=p) 的反⾯意思,⽐如:
var result = "hello".replace(/(?!l)/g, '#');
console.log(result);
// => "#h#ell#o#"
(?<=p)和(?<!p)同理

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。