Regex

基础

Literal Characters

  • 普通字符: “a”
  • 转义字符: "\", "^", "$", ".", "|", "?", "*", "+", "()", "[]", "{}"

“.“匹配任一字符

  • “gr.y"可以匹配"gray”,“grey"或"gr%y”
  • 应尽量少使用”.“来匹配
  • 除了换行符

“?”, “*”, “+”, “{n}“表示 Repetition

  • "?" 表示0次或1次,例如 colou?r 匹配 colorcolour
  • "*" 表示0次或多次
  • "+" 表示1次或多次
  • "{n}" 表示n次,"{n,m}" 表示n到m次

例子:<[A-Za-z][A-Za-z0-9]*> 表示 "*" 前面的 [A-Za-z0-9] 重复0次或多次,可以匹配 xml 中的一个 tag

“[]” 表示 Character Sets

  • 用中括号括起来的一组字符,匹配其中一个char:
    • ex: gr[ae]y: 匹配"gray"或"grey”
  • 在中括号中使用 "-" 来表示一个范围:
    • ex: [0-9a-zA-Z]匹配一个字母或数字
  • 在中括号中使用 "^" 来表示去掉某些字符:
    • ex: “q[^u]“表示"q"后面不接"u"字符

“|” 表示 Alternation

  • 例如"cat|dog"可以匹配"cat"或"dog”
  • 可以连续使用,例如"cat|dog|fish”
  • 使用括号将选择括起,例如 cat|dog food 匹配 catdog food,而 (cat|dog) food 匹配 cat fooddog food

Anchors

  • "^" 匹配一行之首
  • "&" 匹配一行之尾
  • "\b" 匹配一个单词之首或之尾,例如 \bhi\b 可以匹配 say hi tom 中的 hi

Shorthand Character Classes

  • "\d" 表示一个数字字符
  • "\w" 表示一个字母字符,包括 a-z,A-Z"_",等价于[a-zA-Z_]
  • "\s" 表示一个空白字符,包括空格、tab、换行符

Non-Printable Characters

  • "\t""\n" 等,使用 "\uFFFF""\x{FFFF}" 表示 unicode 字符

Greedy and Lazy Repetition

  • 上面的 "?", "*", "+" 默认为贪婪匹配,例如 <.+> 会匹配 <EM>first</EM> 而不是其中的 <EM>
  • 在 quantifier 后面加上 "?" 改变为懒惰匹配,例如 <.+?> 会匹配 <EM>

Grouping and Capturing

  • 用小括号将一组字符组合,在匹配后可以 capture 该组
  • 使用 Set(?:Value)? 创建 group 但是不会创建 capturing group

Backreferences

  • ([abc]=\1) 可以匹配 a=a,b=b,c=c

Lookaround

  • 匹配一个 group 周边的字符
    • q(?=u) 匹配 question 中的 "q"
    • "q(?!u)" 匹配 "Iraq" 中的 "q"
    • "(?<=a>)b" 匹配 "abc" 中的 "b"

常用

多行匹配

"." 不能匹配换行符,(?:.|\n) 指定了一个非捕获组,来匹配换行符

r'/\*((?:.|\n)*?)\*/'