正则指引
2021-12-01 17:52:15 28 举报
AI智能生成
《正则指引》读书笔记,用到的时候拿来查一下,很方便
作者其他创作
大纲/内容
正则指引JavaScript描述
其他
转义
元字符
( ) [ ] { } \\ ^ $ | ? * + .
表达式优先级
括号组合最高 ( )
量词 * ? +
普通拼接 abc
多选结构最低 a|bc
匹配原理
有穷自动机
正则的匹配过程
回溯
常见问题解决思路
元素逻辑
必须出现
不用量词*和?限制
不出现在多选结构中
可能出现
量词
字符组
多选结构
不能出现
必须出现一个字符,但不能是某些字符,使用排除型字符组 [^...]
某个位置不容许出现某个字符,使用否定顺序环视(?!...)
常见操作
验证
RegExp.test(string)
string.search(RegExp)
提取
string.match(RegExp)
RegExp.exec(string)
替换
切分
string.split(RegExp)
优化建议
使用缓存
避免重复匹配
可借助可视化工具regexper
不过分依赖
只需字符串操作可以完成的,不要使用正则
个人思考
境界一:语法
境界二:列出可能性
境界三:总结可能性的规律
可视化工具 regexpal.com
普通字符组
含义:在某个位置可能出现的某个字符
写法:在 [ ] 中列出所有可能出现的字符。 例:[0-9][-09][0a9]
范围表示法
例:[0-9]
例:[0-9a-zA-Z]
排除型字符组
脱字符 ^ 紧跟在 [ 之后
只能排除单个字符
例:[^0-9] 非数字字符,[^/>] 不能是/或>
字符组简记法
\\d
digit 数字
[0-9]
\\w
word 字符
[0-9a-zA-Z_] 注意这里包括下划线,坑爹
\\s
space 空
[ \\t\\\\v\\f] 第一个是空格
\\D \\W \\S
表示排除
匹配任意字符
[\\d\\D]、[\\w\\W]、[\\s\\S]
点号. 匹配除换行符\外的任意字符
一般形式
{n} 必须n次。 例:\\d{6}
常用量词
实用例子
/<[^>]+>/ 所有html标签
/<[^/>][^>/]*>/ 开标签
/</[^>]+>/ 闭标签
/<[^>/]+/>/ 自闭合标签
/\"[^\"]*\"/ 双引号字符串
忽略优先量词
含义:先忽略优先量词的匹配,先尝试匹配后面的表达式;如果后面的尝试匹配失败,再回溯匹配优先量词表达式。
适用特点:提取多个匹配的段落、每个段落中有任意字符
用法:在优先量词后加 ?
/<script[\\s>][\\s\\S]+?<\\/script>/g用来匹配两段<script>脚本。类似的都可以。
/\\/\\*[\\s\\S]*?\\*\\//g用来匹配多行注释 /* ... */
///.*/用来匹配单行注释 //
(\"我是一个老师他是教师\").match(/是[\\w\\W]*?师/g)
量词的转义
优先量词的转义
忽略优先量词的转义
如果想表示字符串*?本身,必须写成\\*\\?
括号
分组
( ) 子表达
/^[1-9]\\d{14}(\\d{2}[0-9X])?&/匹配15位或18位身份证
/<[^/]([^>]*[^/])?>/准确匹配html开标签
(...|...) 多个子表达式,满足其中一个即可
匹配身份证可改为/^([1-9]\\d{14}|[1-9]\\d{14}\\d{2}[0-9X])$/
匹配手机号/^(0|\\+86)?(13[0-9]|15[0-9]|18[025-9])\\d{8}$/
引用分组
将子表达式匹配的文本存储起来,供之后使用
捕获分组
js中,如果在正则表达式内部引用捕获分组,使用 \um 记法/^([a-z])\\1$/.test(\"aa\")
js中,如果在替换文本中引用捕获分组,使用 $num 记法执行:\"2012-12-20\
不捕获分组
(?: ) 该分组不参与捕获,通常使用exec()方法。
截取URL中的host+path部分 /(?::\\/\\/)(.+?)(?=\\?)/g.exec('http://www.baidu.com?a=10')[1]
截取npm模块版本号数字部分 /(?:[~^]?)((\\d+\\.){2}\\d+)(?:[-]?)/g.exec('~000.000.000beta.1')
反向引用
匹配成对的html tag
断言
概念
判断某个位置左/右两侧的文本是否符合要求
单词边界
\\b
加了\\b的一侧即限定了边界
\\b\\w+\\b匹配英文单词
\\B
与\\b互斥
行起始/结束位置
^ 行起始位置
$ 行结束位置
环视
顺序
肯定
(?= ) 肯定顺序环视
否定
(?! ) 否定顺序环视
逆序(js不支持)
(?<= ) 肯定逆序环视
(?<! ) 否定逆序环视
和^的区别是,环视真正匹配的不包括右侧字符
匹配模式
不区分大小写模式 /.../i
多行模式 /.../m
全局模式 /.../g
0 条评论
回复 删除
下一页