正则表达式与通配符

正则表达式

正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,通常被包裹在 // 之间

正则表达式有诸多不同的实现,这篇笔记参考了MDN 正则表达式

匹配单个字符

  • . 匹配除\n \r之外的一个字符
  • 范围匹配
    • [xyz] [a-z] 匹配包含在方括号中的一个字符
    • [^xyz] [^a-z] 匹配包含在方括号中的一个字符
    • x|y 匹配 x y,注意:此处的 xy 可以是字符串

  • \d 匹配一个十进制数字
  • \D 匹配非\d
  • \s 匹配一个空白字符
  • \S 匹配非\s
  • \w 等价于[A-Za-z0-9_]
  • \W 匹配非\w

  • 字符转义
    • \n 匹配换行符
    • \r 匹配回车符
    • \t 匹配制表符
    • \unnnn 匹配 Unicode 字符
    • ……

匹配特殊位置

  • ^ 匹配输入字符串的开始位置
  • $ 匹配输入字符串的结束位置
  • \b 匹配一个单词的边界
  • \B 匹配非\b

“零宽断言”,“零宽”代表下面表达式里的 y 仅仅是匹配 x 时的条件,并不影响之后对 y 的匹配

此处的 xy 可以是字符串

  • x(?=y) 匹配后面接 yx
  • x(?!y) 匹配后面不接 yx
  • (?<=y)x 匹配前面接 yx
  • (?<!y)x 匹配前面不接 yx

后两条零宽断言有诸多的使用限制

限制匹配数量

  • * 匹配前面的子表达式 不小于 0
  • + 匹配前面的子表达式 不小于 1
  • ? 匹配前面的子表达式 0或1
  • {n} 匹配前面的子表达式 刚好 n
  • {n,} 匹配前面的子表达式 至少 n
  • {n,m} 匹配前面的子表达式 nm 次,在逗号和两个数之间没有空格

  • quantifiers? quantifiers 为上述数量限定符,? 使此数量限定符匹配的子表达式尽可能少

分组、匹配并存储

分组可以显式地分隔正则表达式的子表达式

  • (subexp) 匹配 subexp,并将结果存储到 分组编号(从1开始)中
  • (?<name>subexp) 匹配子表达式,并存储到 name

  • (?:subexp) 匹配子表达式,但不存储

上文“零宽断言”虽然形似分组,但其既不匹配也不存储

匹配被存储的内容

  • \分组编号 匹配 分组编号 中的值
  • \k<name> 匹配 name 中的值

在替换中使用被存储的字符串

在替换模式下,用于替换正则表达式匹配的值

  • $分组编号 表示 分组编号 里的值
  • ${name} 表示 name 里的值
  • $$ 表示 $ 字符

通配符(WildCard)

匹配文件名或目录名

  • * 匹配任意字符任意次
  • ? 匹配任意字符一次
  • [xyz] [a-z] 匹配指定的字符
  • [^xyz] [^a-z] 匹配非其中的任意字符
  • ~ 本用户的家目录
  • ~username username 的家目录

参考与引用