正则表达式
2022-03-05 17:50:25 12 举报
AI智能生成
理解匹配的思路
作者其他创作
大纲/内容
匹配啥
匹配那个东西前面
使用前瞻
定义
(?=exp):匹配一个位置,这个位置后面是exp
exp1(?=exp2):匹配exp2前面的exp1,匹配结果不包含exp2
示例
比如要匹配字符串中script前面的部分java, /java(?=script)/
匹配那个东西的后面
使用后顾
定义
(?<=exp) : 匹配一个位置,这个位置前面是exp
(?<=exp2)exp1:匹配exp2后面的exp1,匹配结果不包含exp2
匹配不是啥
匹配后面不是啥的
使用负前瞻
定义
负前瞻定义 (?!exp):匹配一个位置,这个位置后面不是exp
exp1(?!exp2):匹配后面不是exp2的exp1,匹配结果不包含exp2
示例
要匹配字符串中后面不是script的java, /java(?!script)/
匹配前面不是啥的
使用负后顾
定义
负后顾定义 (?<!exp):匹配一个位置,这个位置前面不是exp
(?<!exp2)exp1:匹配前面不是exp2的exp1,匹配结果不包含exp2
示例
匹配不包含连续abc的字符串
步骤
匹配位置后面不能是abc,使用负前瞻匹配这样的位置:/(?!abc)/
这个位置后面可以是其他的字符,用\w来表示:/(?!abc)\w/
满足上面情况后的位置,可以连续多次,用+来表示数量:/((?!abc)\w)+/
从开始到结束每个位置都要覆盖到,添加开始结束标记:/^((?!abc)\w)+$/
匹配多少次
长度规则
*:匹配任意次
+:最低匹配1次
?:匹配1次或者0次
{m}:匹配m次
{m,}:最低匹配m次
{m,n}:最低匹配m次,最多匹配n次,m需要小于等于n
正则默认是贪婪匹配,就是符合条件的会一直匹配,如果想阻止贪婪匹配,可以在长度规则后面加一个?
使用分组
regregregregregreg
/(\w{3})\1/
如果想匹配类似8899或者5522这种连续重叠类型但是不确定具体是什么的字符。可以把重叠的第一个放入分组,再通过\n(n表示第几个分组)捕获这个分组内容
分组捕获
如果想在外部去捕获分组匹配的数据可以使用RegExp.$1-$9来获取
/([a-z]{2})(\d{2})/.test("xyz123")
RegExp.$1 //返回第一个分组表达式匹配到的内容 yz
RegExp.$2 //返回第二个分组表达式匹配到的内容 12
RegExp.$1 //返回第一个分组表达式匹配到的内容 yz
RegExp.$2 //返回第二个分组表达式匹配到的内容 12
分组不捕获
如果不想捕获分组,只需要在分组内加上?:就可以了
/([a-z]{2})(?:\d{2})/.test("xyz123")
RegExp.$1 //返回第一个分组表达式匹配到的内容 yz
RegExp.$2 //分组未被捕获 返回空字符串
RegExp.$1 //返回第一个分组表达式匹配到的内容 yz
RegExp.$2 //分组未被捕获 返回空字符串
图解前瞻后顾中前和后的含义
图
说明
图中绿色字符和位置是已经被匹配检测过的,红色是当前正在匹配检测的,灰色是还未被匹配检测的,匹配的方向是从左往右。前瞻和后顾中的前和后指的是匹配方向的前后,不是字符串位置的前后。前瞻和后顾也有地方被叫做正向零宽断言和负向零宽断言(零宽的意思是只匹配位置不匹配字符),这里正向和负向指的也是匹配方向。
前瞻就是从正在匹配的位置往匹配方向的前方看,去判断前方的字符是否为exp;
后顾就是从正在匹配的位置往匹配的后方看,去判断后方的字符是否为exp;
负前瞻则是往前方看,去判断前方的字符是否不为exp;
负后顾是往后方看,判断后方的字符是否不为exp
内容整理来源
https://juejin.cn/post/6939854031787393031
正则表达式在线
可视化
https://jex.im/regulex/
https://regexper.com
强大的
https://regex101.com/
正则表达式手册
https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
0 条评论
下一页