正则表达式

一、基本介绍

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

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

点击自行练习



二、元字符

正则表达式主要依赖于元字符. 元字符不代表他们本身的字面意思, 他们都有特殊的含义。需要注意的是,一些元字符写在方括号中的时候有一些特殊的意思。
在这里插入图片描述
严格从末尾匹配,“任一除换行符的字符”+“at” 加或者不加 “.”,即"(.)at"或"(.)at(.)"。

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

2.1 . 点运算符

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

".ar" => car 或 war 或 jar 等

2.2 字符集(类)

1. 字符集

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

"[Tt]he" => The 或 the

2. 否定字符集

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

# 不能是car
"[^c]ar" => war 等

2.3 重复字符

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

1. * 号

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

"[a-z]*" => 匹配一个行中所有以小写字母开头的字符串

表示匹配空格的符号\s

2. + 号

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

"c.+t" => cabc dt 或 ct

3. ? 号

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

"[T]he" => The 或 he

2.4 {} 号

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

"[0-9]{2,3}" => 匹配最少 2~3 位 0~9 的数字

2.5 (…) 特征标群

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

"(c|g|p)ar" => car 或 gar 或 par
"(c){2,3}" => cc 或 ccc 

2.6 | 或运算符

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

"(T|t)he|car" => The 或 the 或 car

2.7 转码特殊字符

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

"(f|c|m)at\.?" => fat. 或 cat

2.8 锚点

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

"^(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 ?=… 正先行断言——存在

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

"(T|t)he(?=\sfat)" => 匹配"The fat cat sat on the mat."字符串中" fat"前的"The"

4.2 ?!.. 负先行断言

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

"(T|t)he(?!\sfat)" => 匹配"The fat cat sat on the mat."字符串中后面不紧跟着" fat""the"

4.3 ?<= … 正后发断言

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

"(?<=the\s)(fat|mat)" => 匹配"The fat cat sat on the mat."字符串中"the "后面紧跟着的"mat"

4.4 ?<!.. 负后发断言

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

"(?<!The\s)(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"等。

"/The/gi" => The fat cat sat on the mat.

5.2 全局搜索 (Global search)

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

"/.(at)/g" => The fat cat sat on the mat.

5.3 多行修饰符 (Multiline)

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

# 匹配"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"。

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

参考资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值