0%

最后一次总结正则表达式(RegExp)

最后一次总结正则表达式(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

应用场景

本质上均为匹配

  1. 校验,通常为全词匹配,校验输入等。
    • 如邮箱,中文姓名,身份证,日期,手机号,IP地址,小数金额等
  2. 查找或提取特定字符串,爬虫常用
    • 提取网页中图片(img标签),超链接(href标签)等
  3. 替换,新增或删除
    • 删除注释,见练习3
    • 新增,见练习1
  4. 判断(特殊校验,使用断言)
    • 判断密码强度

练习

  1. 数字格式化,1234567890 -> 1,234,567,890。\B(?=(\d{3})+$)替换为","\B待替换的内容——边界。加后置断言,当且紧跟3的倍数个数字——(\d{3})+
  2. trim函数实现,即去掉字符串左右的空白字符。(^\s*)|(\s*$)替换为""
  3. 删除注释
    1. HTML,<!--(.*?)-->
    2. C/JAVA: ((?<!:)\/\/.*)|(\/*(.\s)*?\*\/)
      • (?<!:)排除前面包含:的情况,防止http://的情况
      • 替换//和/**/
  4. 判断素数(奇技淫巧,装B用,性能和可读性没优势)
    1
    2
    3
    function isPrime(num) {
    return !/^1?$|^(11+?)\1+$/.test(Array(num+1).join('1'));
    }
  5. 密码校验,要求包括字母,数字,特殊字符(_#$%等)
    ^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W\_]).{8,16}$

附录

教程

  1. http://www.regular-expressions.info/ 类似官方
  2. http://deerchao.net/tutorials/regex/regex.htm 中文教程
  3. http://www.jb51.net/tools/regex_test.htm 速查表
  4. https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ cheatsheet速查

调试工具

  1. https://www.debuggex.com/ 最好用,但经常访问不到或服务出错
  2. https://regex101.com/
  3. https://regexper.com/ 只是解析表达式,不能测试匹配,可本地化
  4. https://regexr.com/ 只是JS解析器

常用正则

  1. https://www.jianshu.com/p/e7bb97218946