正则指引JavaScript描述
2021-12-01 17:52:15 28 举报
AI智能生成
《正则指引》读书笔记,用到的时候拿来查一下,很方便
作者其他创作
大纲/内容
其他
转义
元字符
( ) [ ] { } \ ^ $ | ? * + .
表达式优先级
括号组合最高 ( )
量词 * ? +
普通拼接 abc
多选结构最低 a|bc
匹配原理
有穷自动机
正则的匹配过程
回溯
常见问题解决思路
元素逻辑
必须出现
不用量词*和?限制
不出现在多选结构中
可能出现
量词
字符组
多选结构
不能出现
必须出现一个字符,但不能是某些字符,
使用排除型字符组 [^...]
使用排除型字符组 [^...]
某个位置不容许出现某个字符,
使用否定顺序环视(?!...)
使用否定顺序环视(?!...)
常见操作
验证
RegExp.test(string)
string.search(RegExp)
提取
string.match(RegExp)
RegExp.exec(string)
替换
string.replace(RegExp, replacement)
切分
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\r\n\v\f] 第一个是空格
\D \W \S
表示排除
匹配任意字符
[\d\D]、[\w\W]、[\s\S]
点号. 匹配除换行符\n外的任意字符
量词
一般形式
{n} 必须n次。 例:\d{6}
{m,n} 至少m次,至多n次。 例:\d{4,6}
{m,} 至少m次
{0,n} 至多n次
逗点 , 后不能有空格
常用量词
* 等同于 {0,} 可能出现,也可能不出现
+ 等同于 {1,} 至少出现1次
? 等同于 {0,1} 至多出现一次,可能不出现
实用例子
/<[^>]+>/ 所有html标签
/<[^/>][^>/]*>/ 开标签
/</[^>]+>/ 闭标签
/<[^>/]+/>/ 自闭合标签
/"[^"]*"/ 双引号字符串
忽略优先量词
含义:先忽略优先量词的匹配,先尝试匹配后面的表达式;
如果后面的尝试匹配失败,再回溯匹配优先量词表达式。
如果后面的尝试匹配失败,再回溯匹配优先量词表达式。
适用特点:提取多个匹配的段落、每个段落中有任意字符
用法:在优先量词后加 ?
实用例子
/<script[\s>][\s\S]+?<\/script>/g
用来匹配两段<script>脚本。类似的都可以。
用来匹配两段<script>脚本。类似的都可以。
/\/\*[\s\S]*?\*\//g
用来匹配多行注释 /* ... */
用来匹配多行注释 /* ... */
///.*/
用来匹配单行注释 //
用来匹配单行注释 //
("我是一个老师他是教师").match(/是[\w\W]*?师/g)
量词的转义
优先量词的转义
如果想表示字符串{m,n}本身,必须写成\{m,n}
忽略优先量词的转义
如果想表示字符串*?本身,必须写成\*\?
括号
分组
( ) 子表达
实用例子
/^[1-9]\d{14}(\d{2}[0-9X])?&/
匹配15位或18位身份证
匹配15位或18位身份证
/<[^/]([^>]*[^/])?>/
准确匹配html开标签
准确匹配html开标签
/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\.){1,63}[a-z0-9]+$/
匹配Email地址
匹配Email地址
多选结构
(...|...) 多个子表达式,满足其中一个即可
匹配身份证可改为
/^([1-9]\d{14}|[1-9]\d{14}\d{2}[0-9X])$/
/^([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}$/
/^(0|\+86)?(13[0-9]|15[0-9]|18[025-9])\d{8}$/
引用分组
将子表达式匹配的文本存储起来,供之后使用
捕获分组
js中,如果在正则表达式内部引用捕获分组,使用 \num 记法
/^([a-z])\1$/.test("aa")
/^([a-z])\1$/.test("aa")
js中,如果在替换文本中引用捕获分组,使用 $num 记法
执行:"2012-12-20".replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1")
输出:12/20/2010
执行:"2012-12-20".replace(/(\d{4})-(\d{2})-(\d{2})/, "$2/$3/$1")
输出:12/20/2010
不捕获分组
(?: ) 该分组不参与捕获,通常使用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互斥
行起始/结束位置
^ 行起始位置
$ 行结束位置
环视
顺序
肯定
(?= ) 肯定顺序环视
否定
(?! ) 否定顺序环视
例:^(?![0-9]+$)(?![a-zA-Z]+$)\w{8,16}$
由字母数字组合的8-16位字符串,
(?![0-9]+$) 表示不能全是数字
(?![a-zA-Z]+$) 表示不能全是字母
由字母数字组合的8-16位字符串,
(?![0-9]+$) 表示不能全是数字
(?![a-zA-Z]+$) 表示不能全是字母
逆序(js不支持)
肯定
(?<= ) 肯定逆序环视
否定
(?<! ) 否定逆序环视
和^的区别是,环视真正匹配的不包括右侧字符
匹配模式
不区分大小写模式 /.../i
多行模式 /.../m
全局模式 /.../g
收藏
收藏
0 条评论
下一页