最后一次总结正则表达式(RegExp)
正则很强大,但有时候就是不知道如何用它,或想不起来用它,之前写过简单的RegExp 常用语法,这次把语法再简单复习一遍,并努力的描述了正则的应用场景,再加上几个练习以加深印象,希望是自己最后一次总结正则。
语法
量词
字符 | 含义 |
---|---|
? | 0或1次 |
+ | 1次或多次 |
* | 0次或多次 |
{n,m} | n-m次 |
{n,} | n次或更多 |
{n} | n次 |
预定义类
字符 | 等价类 |
---|---|
. | [^\n] |
\d | [0-9] |
\s | [ \f\n\r\t\v] |
\S | [^ \f\n\r\t\v] |
\w | [a-zA-Z_0-9] |
\W | [^a-zA-Z_0-9] |
边界
并没有实际匹配任何字符,只是单纯匹配边界
字符 | 含义 |
---|---|
^ | 开始 |
$ | 结尾 |
\b | 单词开始或结束 |
\B | 非单词开始或结束 |
贪婪
正则表达式默认贪婪模式,在量词后面加?
可启用非贪婪模式。
分组
- 将量词作用于子表达式,如(zz_zigzag){2}
- (?:exp),会忽略该分组,不会匹配组号
后向引用
\b(\w+)\b\s+\1\b
,可匹配he he
这样的字符串,\1
指的是分组1匹配的内容
反向引用
相比于后向引用的\1
,在替换时,$1
指的是分组1匹配的内容
断言
- exp(?=assert),如\w(?=\d),意为后面有一个数字的单词字符。
- exp(?!assert),如\w(?!\d),意为后面无一个数字的单词字符。
- (?<=assert)exp
- (?<!assert)exp
使用时常用
字符 | 含义 |
---|---|
g | globle |
i | ignore case |
m | multiline |
应用场景
本质上均为匹配
- 校验,通常为全词匹配,校验输入等。
- 如邮箱,中文姓名,身份证,日期,手机号,IP地址,小数金额等
- 查找或提取特定字符串,爬虫常用
- 提取网页中图片(img标签),超链接(href标签)等
- 替换,新增或删除
- 删除注释,见练习3
- 新增,见练习1
- 判断(特殊校验,使用断言)
- 判断密码强度
练习
- 数字格式化,1234567890 -> 1,234,567,890。
\B(?=(\d{3})+$)
替换为","
,\B
待替换的内容——边界。加后置断言,当且紧跟3的倍数个数字——(\d{3})+
。 - trim函数实现,即去掉字符串左右的空白字符。
(^\s*)|(\s*$)
替换为""
- 删除注释
- HTML,
<!--(.*?)-->
- C/JAVA:
((?<!:)\/\/.*)|(\/*(.\s)*?\*\/)
(?<!:)
排除前面包含:的情况,防止http://
的情况- 替换//和/**/
- HTML,
- 判断素数(奇技淫巧,装B用,性能和可读性没优势)
1
2
3function isPrime(num) {
return !/^1?$|^(11+?)\1+$/.test(Array(num+1).join('1'));
} - 密码校验,要求包括字母,数字,特殊字符(_#$%等)
^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W\_]).{8,16}$
附录
教程
调试工具
- https://www.debuggex.com/ 最好用,但经常访问不到或服务出错
- https://regex101.com/
- https://regexper.com/ 只是解析表达式,不能测试匹配,可本地化
- https://regexr.com/ 只是JS解析器