正则表达式

2022-10-25 15:54:03 浏览数 (3)

正则表达式

  • 一、基本介绍
  • 二、元字符
    • 2.1 . 点运算符
    • 2.2 字符集(类)
      • 1. 字符集
      • 2. 否定字符集
    • 2.3 重复字符
      • 1. * 号
      • 2. 号
      • 3. ? 号
    • 2.4 {} 号
    • 2.5 (...) 特征标群
    • 2.6 | 或运算符
    • 2.7 转码特殊字符
    • 2.8 锚点
  • 3. 简写字符集
  • 4. 零宽度断言(前后预查)
    • 4.1 ?=... 正先行断言——存在
    • 4.2 ?!... 负先行断言
    • 4.3 ?<= ... 正后发断言
    • 4.4 ?<!... 负后发断言
    • 5. 标志
    • 5.1 忽略大小写 (Case Insensitive)
    • 5.2 全局搜索 (Global search)
    • 5.3 多行修饰符 (Multiline)
    • 5.4 贪婪匹配与惰性匹配 (Greedy vs lazy matching)

一、基本介绍

正则表达式(Regular Expression,简称Regex)是在一个主体字符串中从左到右匹配字符串时的一种样式。

  • 大小写敏感
  • 默认采用贪婪匹配,会匹配尽可能长的子串(优先)
  • 默认捕获第一个匹配的字符串

点击自行练习

二、元字符

正则表达式主要依赖于元字符. 元字符不代表他们本身的字面意思, 他们都有特殊的含义。需要注意的是,一些元字符写在方括号中的时候有一些特殊的意思。

严格从末尾匹配,“任一除换行符的字符” “at” 加或者不加 “.”,即"(.)at"或"(.)at(.)"。

代码语言:javascript复制
# 匹配"mat.",加上"."因为是贪心
# 若最后一行为"on the ma",则无法匹配任何
"/.at(.)?$/" => The fat
                cat sat
                on the mat.

2.1 . 点运算符

.匹配任意单个字符, 但不匹配换行符。

代码语言:javascript复制
".ar" => car 或 war 或 jar 等

2.2 字符集(类)

1. 字符集

在方括号中使用连字符来指定单个字符集的范围,在方括号中的字符集不关心顺序。

代码语言:javascript复制
"[Tt]he" => The 或 the

2. 否定字符集

一般来说 ^ 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。

代码语言:javascript复制
# 不能是car
"[^c]ar" => war 等

2.3 重复字符

后面跟着元字符 or * or ? 的,用来指定匹配子模式的次数,这些元字符在不同的情况下有着不同的意思。

1. * 号

*号匹配 在*之前的字符出现大于等于0次。

代码语言:javascript复制
"[a-z]*" => 匹配一个行中所有以小写字母开头的字符串

表示匹配空格的符号s

2. 号

号匹配 号之前的字符出现 >=1 次。

代码语言:javascript复制
"c. t" => cabc dt 或 ct

3. ? 号

? 标记在符号之前的字符为可选, 即出现 0 或 1 次。

代码语言:javascript复制
"[T]he" => The 或 he

2.4 {} 号

{} 是一个量词,常用来一个或一组字符可以重复出现的次数。可以是{2},{2,}。

代码语言:javascript复制
"[0-9]{2,3}" => 匹配最少 2~3 位 0~9 的数字

2.5 (…) 特征标群

在 {} 前加入特征标群则表示整个标群内的字符重复 N 次。例如,表达式 (ab)* 匹配连续出现 0 或更多个 ab。

代码语言:javascript复制
"(c|g|p)ar" => car 或 gar 或 par
"(c){2,3}" => cc 或 ccc 

2.6 | 或运算符

或运算符就表示或,用作判断条件。

代码语言:javascript复制
"(T|t)he|car" => The 或 the 或 car

2.7 转码特殊字符

反斜线 在表达式中用于转码紧跟其后的字符,用于指定 { } [ ] / * . $ ^ | ? 这些特殊字符。

代码语言:javascript复制
"(f|c|m)at.?" => fat. 或 cat 等

2.8 锚点

想要匹配指定开头或结尾的字符串就要使用到锚点,^ 指定开头,$ 指定结尾。

代码语言:javascript复制
"^(T|t)he" => 匹配"The car is parked in the garage"字符串中的"The",不匹配the
"(at.)$" => 匹配"The fat cat. sat. on the mat."字符串中mat.中的"at.",不匹配其他at.

3. 简写字符集

正则表达式提供一些常用的字符集简写。

4. 零宽度断言(前后预查)

先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。需要使用括号()

4.1 ?=… 正先行断言——存在

筛选条件为:其后必须跟着断言定义的格式。

代码语言:javascript复制
"(T|t)he(?=sfat)" => 匹配"The fat cat sat on the mat."字符串中" fat"前的"The"

4.2 ?!.. 负先行断言

筛选条件为:其后不跟随着断言中定义的格式。

代码语言:javascript复制
"(T|t)he(?!sfat)" => 匹配"The fat cat sat on the mat."字符串中后面不紧跟着" fat"的"the"

4.3 ?<= … 正后发断言

筛选条件为:其前跟随着断言中定义的格式。

代码语言:javascript复制
"(?<=thes)(fat|mat)" => 匹配"The fat cat sat on the mat."字符串中"the "后面紧跟着的"mat"

4.4 ?<!.. 负后发断言

筛选条件为:其前不跟随着断言中定义的格式。

代码语言:javascript复制
"(?<!Thes)(cat)" => 匹配"The cat sat on cat."字符串中"The "后面不紧跟着的"cat"

理解:例如"(T|t)he(?=sfat)",匹配The或the,且其后必须紧跟着"(空格)fat"。

5. 标志

标志也叫模式修正符,因为它可以用来修改表达式的搜索结果,这些标志可以任意的组合使用。用//包含字符集,其后跟标志。

5.1 忽略大小写 (Case Insensitive)

匹配全局(g)忽略大小写(i)的"The""the""THE"等。

代码语言:javascript复制
"/The/gi" => The fat cat sat on the mat.

5.2 全局搜索 (Global search)

匹配全局(g)"除了换行符的任意字符 at"的全部结果。

代码语言:javascript复制
"/.(at)/g" => The fat cat sat on the mat.

5.3 多行修饰符 (Multiline)

匹配在每行的开头和结尾生效,用到多行修饰符 m。

代码语言:javascript复制
# 匹配"fat"、"sat"、"mat."
"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

# 匹配最长的"mat."
"/.at(.)?$/" => The fat
                cat sat
                on the mat.

5.4 贪婪匹配与惰性匹配 (Greedy vs lazy matching)

正则表达式默认采用贪婪匹配模式,默认情况下,? * {min, max}都是贪婪的。在该模式下意味着会匹配尽可能长的子串。我们可以在修饰匹配次数的特殊符号后再加上一个 ? ,将贪婪匹配模式转化为惰性匹配模式。

匹配默认匹配最长的,从开头一直到匹配到"fat"的"at",即"The fat"。

代码语言:javascript复制
# 理解:惰性模式 "首部和尾部均第一次匹配成功,且首尾合理" 就停止,这里前面没有限定,从开头一直匹配到第一个at
"/(.*?at)/" => The fat cat sat on the mat. 

参考资料

0 人点赞