正则表达式
2020-10-13 / sunsh      更新日期:2020-10-15 16:14:50

正则表达式:是一种文本模式包括普通(原义)字符和特殊意义字符(元字符: 代替一个或多个字符,可以规定其前面的字符在目标对象中如何出现)。

作用:字符串校验、替换和提取子串。

正则表达式构造: 类似创建数学表达式:用多种元字符和运算符可将小的表达式创建成更大的。

正则表达式组件:单个字符、字符集合[]或者[^](取反)、字符范围{}、字符间的选择|及这些组件的任意组合。

字符:

  • 普通字符:除元字符外的,包括可打印不可打印的。

  • 特殊字符:

    • 限定符:限定前面的子表达式出现次数。*,+,?,{n}, {n,}, {n, m}。前两个是贪婪的,?非贪婪。通过在 *,+? 限定符之后放置 **?**,该表达式从”贪婪”表达式转换为”非贪婪”表达式(最小匹配)。

    • 定位符:将正则固定到行首尾或者单词首尾。^,$, \b(单词边界),\B。边界只能有一个,限定定位不能同时用,如:^*。

    • 选择: ()表示捕获分组,标记 子表达式 的开始结尾,会把里面匹配值保存起来,多匹配值可用n查看。

      ​ eg: '123adfj464'.match(/([1-9])([a-z]+)/g) //['3adfj']

      副作用:把匹配的结果缓存(存在临时缓冲区编号从1到99,可以\n方位缓冲区,n为十进制数)。消除方法用 ?: 非捕获元,放在第一个选项前,即(?:[1-9])。

      除了?: 外?= 和?!也是非捕获元

      ​ **exp1(?=exp2)**:查找 exp2 前面的 exp1。

      (?<=exp2)exp1:查找 exp2 后面的 exp1

      ​ **exp1(?!exp2)**:查找后面不是 exp2 的 exp1

      (?<!=exp2)exp1:查找前面不是 exp2 的 exp1。

      参考正则表达式的先行和后行断言:https://www.runoob.com/w3cnote/reg-lookahead-lookbehind.html

    • 修饰符**:igm(多行匹配, 边界字符 **^$ 匹配每一行的开头和结尾)s(.符不包括\n的任意字符,加s后匹配包括\n)

  • 运算符优先级:高到低
    ​ \转义符

    ​ ()(?:)(?=)[]圆括号方括号

    ​ *, +, ?, {n}, {n,}, {n,m}限定符

    ​ ^, $,定位符和序列(\元字符或任何字符)

    ​ |或操作: 字符高于替换运算符的优先级,”m|food”匹配”m”或”food”。要匹配”mood”或”food”,使用括号创建子表达式,从而产生”(m|f)ood”

  • () 和 [] 的区别

    () 内的内容表示的是一个子表达式,() 本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理。

    [] 表示匹配的字符在 [] 中,并且只能出现一次,并且特殊字符写在 [] 会被当成普通字符来匹配。例如 [(a)],会匹配 (、a、)、这三个字符。

  • 小括号的另一种用途是通过语法(?#comment)来包含注释。最好开启修饰符中IgnorePatternWhitespace(忽略空白)

    eg: 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)

    1
    2
    3
    4
    5
    6
    7
    (?<=    # 断言要匹配的文本的前缀
    <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
    ) # 前缀结束
    .* # 匹配任意文本
    (?= # 断言要匹配的文本的后缀
    <\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
    ) # 后缀结束
本文链接:http://sunsonghao.github.io/2020/10/13/Note/regexp/