正则表达式学习记录

137 阅读2分钟

1.怎么学习和使用

4步走流程:

  1. 做分解
  2. 分析各个子问题
  3. 套皮
  4. 调试

克制使用正则

  1. 能用普通字符串解决的,坚决用普通字符串解决

  2. 能写注释的正则表达式,一定要写注释

  3. 能写多个正则表达式解决的,不要苛求用一个复杂的正则表达式解决

2.元字符

  1. 特殊单字符:
    1. .:任意字符(换行除外)
    2. \d:任意数字、\D:任意非数字
    3. \w:任意字母数字下划线、\W:任意非字母数字下划线
    4. \s:任意空白符、\S:任意非空白符
  2. 空白符:
    1. \r:回车符
    2. \n:换行符
    3. \f:换页符
    4. \t:制表符
    5. \v:垂直制表符
    6. \s:任意空白符
  3. 量词
    1. *:0到多次
    2. +:1到多次
    3. ?:0到1次,入colou?r
    4. {m}:出现m次
    5. {m,}:出现至少m次
    6. {m,n}:m到n次
  4. 范围
    1. |或,:如ab|bc代表ab或者bc
    2. […]:多选一,括号中任意单个元素
    3. [a-z]:匹配a到z之间任意单个元素
    4. [^...]:取反,不能是括号中的任意单个元素

3.量词与贪婪

如果只是判断文本是否符合规则,则可以使用独占模式; 如果需要获取匹配的结果,则根据需要使用贪婪或非贪婪。

  1. 贪婪模式:正则中量词默认是贪婪匹配,尽可能多的匹配。
  2. 非贪婪模式:非贪婪匹配需要在量词后面加上问号。尽可能少的匹配。
  3. 独占模式:量词后面加上+,也是进行贪婪匹配,不会进行回溯,性能好,但不一定可以满足需求,还要看语言是否支持。

4.分组与引用

  1. 分组和子组编号,括号可以将某部分括起来,看成一个整体,也可以保存为一个子组,在后续查找替换的时候使用,例如第一组,可以使用\1,在JavaScript中以$1表示为第一组。如果不想保持为子组,则在括号里加上?:。
  2. 分组命名规则:(?P<名称>正则)

5.匹配模式

  1. 不区分大小写模式:模式修饰符(?i),在js中使用/regex/i 来指定匹配模式。
  2. 点号通配模式:模式修饰符(?s),在js中不支持此模式。
  3. 多行模式:模式修饰符(?m),为了使^和$能匹配每行的开头和结尾。
  4. 注释模式:(?#comment)

6.断言

  1. 单词边界:\b

  2. 行的开始/结束:^表示行开始,$表示行结束

  3. 环视:环视不会被保存成子组,环视只匹配位置,不匹配内容。

    正则 名称 含义 示例
    (?=Y) 肯定顺序环视 右边是Y six(?=\d)右边是数字的six,能匹配six6
    (?!Y) 否定顺序环视 右边不是Y hi(?!\d)
    右边不是数字的hi,能匹配hight
    (?<=Y) 肯定逆序环视 左边是Y (?<=\d)th
    左边是数字的th,能匹配9th
    (?<!Y) 否定逆序环视 左边不是Y (?<!\d)th
    左边不是数字的th,能匹配health

7.转义

  1. 转义字符:对它后续的几个字符进行替代并解释,其功能如下
    1. 编码无法用字母表直接表示的特殊数据
    2. 表示无法直接键盘录入的字符(如回车符)
  2. 字符串转义和正则转义
    1. 字符串转义:输入字符串到字符串文本的过程
    2. 正则转义:正则文字到正则表达式的过程
    3. 匹配反斜杠本身需要4个\
    4. 简化方式:使用原生字符串
  3. 元字符的转义:
    1. 元字符的转义一般在前面加反斜杠
    2. 方括号[]和花括号{}一般转义开括号,但圆括号()需要2个都转义。
  4. 字符组中的转义
    1. 脱字符^在中括号中,且在第一个位置
    2. 中划线在中括号中,且不在首尾位置
    3. 右括号在中括号中,且不在首位
    4. 其他单个长度的元字符一般不需要转义

8.常用正则表达式

1.千分位

Number.prototype.formatThousand = function () {
    if (!this) {
    	return '0';   
    }
    // 先转成字符串
    let num = String(this);
    const reg = num.indexOf('.')!== -1 ? /(\d)(?=(?:\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g;
    return num.replace(reg, '$1,');
}
let num = 123456.789;
num.formatThousand();