【技术分享】系统理解正则表达式--------3个括号1个问号
什么是正则表达式?
一种从左到右匹配主体字符串的模式。 “Regular expression ---> regex或regexp”。
正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等。例:

1.基本匹配
正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成。
正则表达式123匹配字符串123。它逐个字符的与输入的正则表达式做比较。 正则表达式是大小写敏感的,所以The不会匹配the。
"the" => The fat cat sat on the mat.
如果需要匹配多种可能的字符,使用字符集[]。
如[Tt]表示该字符可以是t或者T中的一个
"[Tt]he" => The car parked in the garage.
如[0-9]表示该字符可以是0,1,2,3,4,5,6,7,8,9中的一个
"[0-9] meters" => The frog climbs 3 meters during the day and retreats 2 meters at night.
2 简写字符
正则表达式提供一些常用的字符集简写。如下
| 简写 | 描述 | [a-zA-Z_] | [0-9] | [!&#@等] | 空格 | \f | \n | \r | \t | \v |
|---|---|---|---|---|---|---|---|---|---|---|
| . | 除换行符外的所有字符 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| \w | 匹配所有字母数字,等同于 [a-zA-Z0-9_] | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| \W | 匹配所有非字母数字,即符号,等同于: [^\w] | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| \d | 匹配数字: [0-9] | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| \D | 匹配非数字: [^\d] | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| \s | 匹配所有空格字符,等同于: [\t\n\f\r\p{Z}] | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| \S | 匹配所有非空格字符: [^\s] | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| \f | 匹配一个换页符 | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| \n | 匹配一个换行符 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
| \r | 匹配一个回车符 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| \t | 匹配一个制表符 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
| \v | 匹配一个垂直制表符 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| \p | 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ |
2.1 样例
匹配3个字母,以he结尾
"\whe" => The fat cat sat on the mat.
匹配空格开头的3个字母,以e结尾
"\s\w\we" => The fat cat sat on the mat. tee.
匹配连续4位数字
"\d\d\d\d" => The number was 9.9997 but we rounded it off to 10.0.
匹配6个非空格字符
"\S\S\S\S\S\S" => The number was 9.9997 but we rounded it off to 10.0.
3.元字符
| 元字符 | 描述 |
|---|---|
| . | 句号匹配任意单个字符除了换行符。 |
| [ ] | 字符种类。匹配方括号内的任意字符。 |
| [^ ] | 否定的字符种类。匹配除了方括号里的任意字符 |
| (xyz) | 字符集,匹配与 xyz 完全相等的字符串. |
| {n,m} | 匹配num个大括号之前的字符或字符集 (n <= num <= m). |
| * | 匹配>=0个重复的在*号之前的字符。 |
| + | 匹配>=1个重复的+号前的字符。 |
| ? | 标记?之前的字符为可选. |
| | | 或运算符,匹配符号前或后的字符. |
| ^ | 从开始行开始匹配. |
| & | 从末端开始匹配. |
| \ | 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ | |
3.1 点运算符 .
.匹配任意单个字符,但不匹配换行符。 例如,表达式.ar匹配一个任意字符后面跟着是a和r的字符串。
".ar" => The car parked in the garage.
3.2 字符集 [ ]
方括号用来指定一个字符集。 在方括号中使用连字符来指定字符集的范围。 在方括号中的字符集不关心顺序。
常见配置如[0-9] [a-zA-Z]
例如,表达式[Tt]he 匹配 the 和 The。
"[Tt]he" => The car parked in the garage.
方括号的句号就表示句号。 表达式 ar[.] 匹配 ar.字符串
"ar[.]" => A garage is a good place to park a car.
3.2.1 反字符集 [^ ]
一般来说 ^ 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。
例如,表达式[^c]ar 匹配一个后面跟着ar的除了c的任意字符。
"[^c]ar" => The car parked in the garage.
3.3 字符组 ( )
字符组是一组写在 (...) 中的子模式。(...) 中包含的内容将会被看成一个整体. 配合重复次数时候使用。
例如,c{4}匹配字符 cccc
"abc{4}" => The string abcccccc.
例如,(abc){3}匹配字符abcabcabc
"(abc){3}" => The string abcabcabcabccc.
我们还可以在 () 中用或字符 | 表示或。例如,(car|gar|park) 匹配 car 或 gar 或 park.|与[]都是处理或的关系,[]面向的是单个字符,而|可以应用于单词
"(car|gar|park)" => The car is parked in the garage.
"[cgp]ar" => The car is parked in the garage.
3.4 重复次数 { , }
在正则表达式中 {} 是一个量词,常用来限定一个或一组字符可以重复出现的次数。
例如, 表达式 [0-9]{2,3} 匹配最少 2 位最多 3 位 0~9 的数字。
"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
我们可以省略第二个参数。 例如,[0-9]{2,} 匹配至少两位 0~9 的数字。
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
如果逗号也省略掉则表示重复固定的次数。 例如,[0-9]{3} 匹配3位数字
"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
3.4.1 重复0或1次 ?
在正则表达式中元字符 ? 标记在符号前面的字符或模式为可选,即出现 0 或 1 次。 ? == {0, 1}
例如,表达式 T?he 匹配字符串 he 和 The。
"T?he" => The car is parked in the garage.
将()中数据看作一个整体,表达式(super)?market 匹配字符串 supermarket 和 market。
"(super)?market" => The supermarket is the best market.
3.4.2 重复>=1次 +
+号匹配+号之前的字符或模式出现 >=1 次。 + == {1,}
例如,表达式 (abc)+ 匹配字符串 abc 和 abc*n。
"(abc)+" => The string abcabcabcabccc.
3.4.3 重复>=0次 *
*号匹配 在*之前的字符出现大于等于0次。
例如,表达式 a* 匹配0或更多个以a开头的字符。表达式[a-z]* 匹配一个行中所有以小写字母开头的字符串。
"a\w*" => a an abandon biscuit
"[a-z]*" => The car parked in the garage.
*字符和.字符搭配可以匹配所有的字符.*。*和表示匹配空格的符号\s连起来用,如表达式\s*cat\s*匹配0或更多个空格开头和0或更多个空格结尾的cat字符串。
"\s*cat\s*" => The fat cat sat on the concatenation.
3.5 或运算符 |
或运算符就表示或,用作判断条件。
例如 (\w+)?father|mother 匹配 (\w+)?father 或 mother。
"(\w+)?father|mother" => Dad’s father is grandfather, Dad’s mother is grandmother.
3.6 转义符 \
反斜线 \ 在表达式中用于转码紧跟其后的字符。
用于表示简写字符集,如\s \d \w。
或指定 { } [ ] / \ + * . $ ^ | ? 这些元字符。如果想要匹配这些元字符则要在其前面加上反斜线 \。
例如 . 是用来匹配除换行符外的所有字符的。如果想要匹配句子中的 . 则要写成 \. 以下这个例子 \.是选择匹配.
"(f|s|m)at." => The fat dog sato on the mat.
"(f|s|m)at\." => The fat cat sato on the mat.
3.7 锚点 ^ $
在正则表达式中,想要匹配指定开头或结尾的字符串就要使用到锚点。^ 指定开头,$ 指定结尾。
3.7.1 ^ 号
例如,在 abc 中使用表达式 ^a 会得到结果 a。但如果使用 ^b 将匹配不到任何结果。因为在字符串 abc 中并不是以 b 开头。
例如,^(T|t)he 匹配以 The 或 the 开头的字符串。
"(T|t)he" => The car is parked in the garage.
"^(T|t)he" => The car is parked in the garage.
3.7.2 $ 号
同理于 ^ 号,$ 号用来匹配字符是否是最后一个。
例如,(at\.)$ 匹配以 at. 结尾的字符串。
"(at\.)" => The fat cat. sat. on the mat.
"(at\.)$" => The fat cat. sat. on the mat.
4 ?的其他用法
正则表达式中,? 除了表示重复次数之外还有其他的应用场景。
- 贪婪匹配和惰性匹配
- 条件匹配-前后预检查
4.1 贪婪匹配与惰性匹配
在使用+和*进行多次匹配时,正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。
".*at" => The fat cat sat on the mat. # 贪婪匹配
我们可以使用 ? 将贪婪匹配模式转化为惰性匹配模式。
".*?at" => The fat cat sat on the mat. # 惰性匹配
5 条件匹配
先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。
先行断言作为一种条件约束,匹配结果不包含该确定格式。
格式为pattern(?condition) 或者 (?<condition)pattern, 只有condition条件通过才会返回匹配的字符。
| 符号 | 描述 |
|---|---|
| ?= | 右断言-存在 |
| ?! | 右断言-排除 |
| ?<= | 左断言-存在 |
| ?<! | 左断言-排除 |
条件示例-右断言-存在
例如,表达式 (T|t)he(?=\sfat) pattern=(T|t)he匹配 The 和 the,
"(T|t)he" => The fat cat sat on the mat.
在括号中定义了右通过断言condition= (?=\sfat) , 即判断 The 和 the 后面必须紧跟着 (空格)fat. mat≠ fat所以不匹配the.
"(T|t)he(?=\sfat)" => The fat cat sat on themat.
条件示例-右断言-排除
在括号中定义了右排除断言condition= (?!\sfat), 即判断 The 和 the 后面必须不能紧跟着 (空格)fat. The的后面是 fat,所以不匹配The.
"(T|t)he(?!\sfat)" => Thefatcat sat on the mat.
条件示例-左断言-存在
例如,表达式 (?<=(T|t)he\s)(\wat) pattern=\wat匹配 fat cat sat 和 mat,且其前必须跟着 The 或 the 。
"(\wat)" => The fat cat sat on the mat.
cat 和 sat前面没有 The 或者 the, 所以被排除
"(?<=(T|t)he\s)(\wat)" => The fat cat sat on the mat.
条件示例-左断言-排除
例如,表达式 (?<!(T|t)he\s)(\wat) pattern=\wat匹配 fat cat sat 和 mat,且其前必须不能跟着 The 或 the 。fat 和 mat前面有 The 或者 the,所以被排除
"(?<!(T|t)he\s)(\wat)" =>Thefat cat sat onthemat.
6. 总结 --- 三个括号和1个问号
() 字符组 --- 将多个字符组合成一个组,次数计算时看作一个数据单元
[] 字符集 --- 单个字符匹配时,匹配字符集中任意一个字符视为命中, 简写 . \s \d \w等
{} 次数 --- 限定一个或一组字符可以重复出现的次数, 简写 * ? +
? 的其他用法 --- 贪婪匹配,条件匹配(左,右)
^ $ | 锚点 和 或
其他 --- 忽略大小写,多行修饰符
原文地址:GitHub - ziishaned/learn-regex: Learn regex the easy way
Presentation下载:https://download.csdn.net/download/be5yond/19684795?spm=1001.2014.3001.5501
更多推荐
所有评论(0)