Skip to content

Latest commit

 

History

History
66 lines (56 loc) · 3.4 KB

05正则表达式拆分.md

File metadata and controls

66 lines (56 loc) · 3.4 KB

正则表达式的拆分

结构和操作符

js正则表达式的结构:字符字面量、字符组、量词、锚、分组、选择分支、反向引用

  • 字面量
    • 匹配一个具体字符,包括不用转义的和需要转义的。比如 a 匹配字符“a”
    • 比如 \n 匹配换行符,比如 \. 匹配小数点 .
  • 字符组
    • 匹配一个字符,可以是多种可能之一,比如 [0-9],表示匹配一个数字,简写 \d
    • 反义字符组,表示可以是除了特定字符之外任何一个字符,比如 [^0-9]。表示一个非数字字符,简写 \D
  • 量词
    • 表示一个字符连续出现,比如 a{1,3} 表示 a 字符连续出现 3 次.
    • 简写形式,比如 a+ 表示 a 字符连续出现至少一次.
    • 匹配一个位置,而不是字符。比如 ^ 匹配字符串的开头,又比如 \b 匹配单词边界
    • 比如 (?=\d) 表示数字前面的位置。
  • 分组
    • 用括号表示一个整体,比如 (ab)+,表示 "ab" 两个字符连续出现多次
    • 也可以使用非捕获分组 (?:ab)+
  • 分支
    • 多个子表达式多选一,比如 abc|bcd,表达式匹配 "abc" 或者 "bcd" 字符子串
    • 反向引用,比如 \2,表示引用第 2 个分组
操作符描述 操作符 优先级
转义符 \ 1
括号和方括号 (…)、(?:…)、(?=…)、(?!…)、[…] 2
量词限定符 {m}、{m,n}、{m,}、?、*、+ 3
位置和序列 ^、$、\元字符、一般字符 4
管道符(竖杠) | 5
  • 分析:/ab?(c|de*)+|fg/
    • 由于括号的存在,所以 (c|de*) 是一个整体,并且由于量词 *e* 也是一个整体
    • 并且由于分支结构 | 的优先级最低 cde* 是两个不同的整体结构
    • 整个正则分为 ab?(...)+fg。由于分支的原因又可以分成 ab?(c|de*)+fg

要点

  1. 字符串整体问题,经常会在正则后加上锚 ^$
    • 比如要匹配的目标字符串 abc 或者 bcd,很可能会写成 /^abc|bcd$/
    • 应该修改成 /^(abc|bcd)$/
  2. 量词连缀问题
    • 假设要匹配 abc任选其一,字符串长度是 3 的倍数
    • 如果写成 /^[abc]{3}+/ 会报错,+ 前面没什么好重复的
    • 此时应该写成 /([abc]{3})+/
  3. 元字符转义
    • ^$.*+?|\/、()[]{}=!:-`
    • 以上字符匹配\字符可以转义
    • 跟字符组相关的字符有 []^-。其中匹配开头的 ^ 必须转义,不然会把整个字符组看成反义字符组
    • 当匹配 [abc] 或者 {3,5}
      • 可以写成 /\[abc\]/ 或者 /\[abc]/
      • 可以写成 /\{abc\}/ 或者 /\{3,5}/
    • =!:-, 等符号,只要不在特殊结构内不需要转义

案列

身份证。正则表达式是 /^(\d{15}|\d{17}[\dxX])$/

  • 由于 | 的优先级最低,所以正则分成了两部分 \d{15}\d{17}[\dxX]