Thezmmm

Thezmmm

Never do things by halves.

14 Jun 2022

正则表达式

简介

正则表达式,regular expression,简称regex

正则表达式是一种文本匹配模式,使用单个字符串来描述匹配一系列某个句法规则的字符串

语法

普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号

  1. []

    [匹配的字符],可以指定范围,如[a-z]

  2. \d

    匹配数字字符

    • \S 非数字字符
  3. \w

    匹配数字,字母,下划线,等价于[A-Za-z0-9_]

    • \W 非单词字符
  4. \s

    匹配空白符

    • \S 非空白符
  5. .

    匹配除换行符(\n,\r)以外的任意字符,等价于[^\n\r]

非打印字符

  1. \cx

    匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。

  2. \f

    匹配一个换页符。等价于 \x0c 和 \cL。

  3. \n

    匹配一个换行符,等价于 \x0a 和 \cJ

  4. \r

    匹配一个回车符,等价于 \x0d 和 \cM

  5. \s

    匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。

  6. \S

    匹配任何非空白字符,等价于 [^ \f\n\r\t\v]

  7. \t

    匹配一个制表符,等价于 \x09 和 \cI

  8. \v

    匹配一个垂直制表符,等价于 \x0b 和 \cK

特殊字符

特殊字符在regex中有着特殊的意义,因此想要对特殊字符进行匹配时,需要进行转义,在前面加\

  1. $
  2. ()
  3. *
  4. +
  5. .
  6. [
  7. ?
  8. \
  9. ^
  10. {
  11. |

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配

  1. *

    匹配前面的子表达式零次或多次 等价于{0,}

  2. +

    匹配前面的子表达式一次或多次 等价于{1,}

  3. ?

    匹配前面的子表达式零次或一次 等价于{0,1}

  4. {n}

    n为非负整数,匹配确定的n次

  5. {n,}

    至少匹配n次

  6. {n,m}

    最少匹配n次,且最多匹配m次

贪婪匹配

*+ 限定符都是贪婪的,它们会尽可能多的匹配文字,在它们后面加一个? 可以实现 非贪婪匹配最小匹配

# <h1>test<\h1>

<.*> 将会匹配整个字符串
<。*?> 只匹配<h1>

定位符

定位符使正则表达式可以固定到行首或行尾

  1. ^

    匹配输入字符串开始的位置

  2. $

    匹配输入字符串结尾的位置

  3. \b

    匹配一个单词边界,即字与空格间的位置

  4. \B

    非单词边界匹配

选择

用圆括号() 将所有选项括起来,相邻的选择项之间用 | 分隔

() 会把每个分组里匹配的值保存起来,多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)

缓存

使用圆括号会使相关的匹配被缓存,此时可用非捕获元字符 ?:?=?! 来重写捕获,忽略对相关匹配的保存

  1. ?= 正向肯定预查,在任何匹配exp2的字符串开始处匹配查找字符串

    exp1(?=exp2) 查找exp2前面的exp1

  2. ?<= 反向肯定预查

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

  3. ?! 正向否定预查

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

  4. ?<! 反向否定预查

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

反向引用

修饰符 (标记)

标记也成为修饰符,用于指定额外的匹配策略

标记不写在正则表达式内,而是位于表达式之外

/pattern/flags
  1. i ignore

    不区分大小写

  2. g global

    全局匹配,查找所有的匹配项

  3. m multiple line

    多行匹配 使边界字符^$ 匹配每一行的开头和结尾

  4. s

    特殊字符圆点. 包含换行符\n

    默认情况下,.使匹配除了换行符\n以外的所有字符,加上s修饰符后,.包含换行符\n

字符簇

  1. [[:alpha:]]

    任何字母

  2. [[:digital:]]

    任何数字

  3. [[:alnum:]]

    任何字母和数字

  4. [[:space:]]

    任何空白字符

  5. [[:upper:]]

    任何大写字母

  6. [[:lower:]]

    任何小写字母

  7. [[:punct:]]

    任何标点符号

  8. [[:xdigit:]]

    任何16进制数字,相当于[0-9a-fA-F]