正则表达式
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)/
这个位置后面可以是其他的字符,用\\w来表示:/(?!abc)\\w/
满足上面情况后的位置,可以连续多次,用+来表示数量:/((?!abc)\\w)+/
从开始到结束每个位置都要覆盖到,添加开始结束标记:/^((?!abc)\\w)+$/
步骤
匹配不包含连续abc的字符串
匹配不是啥
*:匹配任意次
+:最低匹配1次
?:匹配1次或者0次
{m}:匹配m次
font color=\"#FF0000\
长度规则
正则默认是贪婪匹配,就是符合条件的会一直匹配,如果想阻止贪婪匹配,可以在长度规则后面加一个?
/(\\w{3})\\1/
regregregregregreg
如果想匹配类似8899或者5522这种连续重叠类型但是不确定具体是什么的字符。可以把重叠的第一个放入分组,再通过\(n表示第几个分组)捕获这个分组内容
使用分组
/([a-z]{2})(\\d{2})/.test(\"xyz123\")RegExp.$1 //返回第一个分组表达式匹配到的内容 yzRegExp.$2 //返回第二个分组表达式匹配到的内容 12
如果想在外部去捕获分组匹配的数据可以使用RegExp.$1-$9来获取
分组捕获
/([a-z]{2})(?:\\d{2})/.test(\"xyz123\")RegExp.$1 //返回第一个分组表达式匹配到的内容 yzRegExp.$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 条评论
回复 删除
下一页