正则表达基础学习
0x00写在前面:
不管是PHP、Python还是JAVA等编程语言,在使用字符串匹配过程中,正则表达匹配往往是首选。下面是个人总结的关于正则表达的基本知识。初学往往只是基础,关键在于实践。
0x01正则表达式 - 概述:
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等。
0x02正则表达式 - 基本匹配:
正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成。
正则表达式是大小写敏感的
0x03正则表达式 - 元字符:
正则表达式主要依赖于元字符。 元字符不代表他们本身的字面意思,他们都有特殊的含义。
一些元字符写在方括号中的时候有一些特殊的意思。
元字符 | 描述 |
---|---|
. | 句号匹配任意单个字符除了换行符。 |
[ ] | 字符种类。匹配方括号内的任意字符。 |
[^ ] | 否定的字符种类。匹配除了方括号里的任意字符 |
* | 匹配>=0个重复的在*号之前的字符。 |
+ | 匹配>=1个重复的+号前的字符。 |
? | 标记?之前的字符为可选. |
{n,m} | 匹配num个大括号之间的字符 (n <= num <= m). |
(xyz) | 字符集,匹配与 xyz 完全相等的字符串. |
| | 或运算符,匹配符号前或后的字符. |
\ | 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 从开始行开始匹配. |
$ | 从末端开始匹配. |
详解:
- 点运算符“.”:
“.”是元字符中最简单的例子。 “.”匹配任意单个字符,但不匹配换行符。
例如:
.ar => The car parked in the garage.
//表达式".ar"匹配一个任意字符后面跟着是a和r的字符串。
- 字符集
字符集也叫做字符类。 方括号用来指定一个字符集。
在方括号中使用连字符来指定字符集的范围。 在方括号中的字符集不关心顺序。例如:表达式[Tt]he 匹配 the 和 The。
方括号的句号就表示句号。 表达式 ar[.] 匹配 ar.字符串
ar[.] => A garage is a good place to park a car.
- 否定字符集
一般来说 ^ 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。 例如:表达式[^c]ar 匹配一个后面跟着ar的除了c的任意字符。
[^c]ar=> The car parked in the garage.
- 重复次数
后面跟着元字符 +,* or ? 的,用来指定匹配子模式的次数。这些元字符在不同的情况下有着不同的意思。
“*”号:“*”号匹配在“*”之前的字符出现大于等于0次。例如:表达式 “a*” 匹配0或更多个以a开头的字符。
表达式[a-z]* 匹配一个行中所有以小写字母开头的字符串。
[a-z]*=> The car parked in the garage #21.
"*"字符和"."字符搭配可以匹配所有的字符".*"。
*号表示匹配空格的符号\s连起来用,如表达式\s*cat\s*匹配0或更多个空格开头和0或更多个空格结尾的cat字符串。
“+”号匹配“+”号之前的字符出现 >=1 次。 例如:表达式c.+t 匹配以首字母c开头以t结尾,中间跟着至少一个字符的字符串。
c.+t" => The fat cat sat on the mat.
“?”号:在正则表达式中元字符“?”标记在符号前面的字符为可选,即出现 0 或 1 次。 例如:表达式 [T]?he 匹配字符串 he 和 The。
[T]he=> The car is parked in the garage. [T]?he=> The car is parked in the garage.
- “{}”号:在正则表达式中 {} 是一个量词,常用来一个或一组字符可以重复出现的次数。例如:表达式 [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.
- “(…)”特征标群
特征标群是一组写在 (...) 中的子模式。例如之前说的 {} 是用来表示前面一个字符出现指定次数。但如果在 {} 前加入特征标群则表示整个标群内的字符重复 N 次。
例如,表达式 (ab)* 匹配连续出现 0 或更多个 ab。
我们还可以在 () 中用或字符 | 表示或。例如,(c|g|p)ar 匹配 car 或 gar 或 par.
(c|g|p)ar => The car is parked in the garage.
- “|”或运算符
或运算符就表示或,用作判断条件。
例如:(T|t)he|car 匹配 (T|t)he 或 car。
(T|t)he|car => The car is parked in the garage.
- 转码特殊字符
反斜线 \ 在表达式中用于转码紧跟其后的字符。用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字符。
如果想要匹配这些特殊字符则要在其前面加上反斜线 \。例如:“.”是用来匹配除换行符外的所有字符的。
如果想要匹配句子中的“.”则要写成 \. 以下这个例子 \.?是选择性匹配.
(f|c|m)at\.? => The fat cat sat on the mat.
- 锚点:在正则表达式中,想要匹配指定开头或结尾的字符串就要使用到锚点。^ 指定开头,$ 指定结尾。
“^”号:^ 用来检查匹配的字符串是否在所匹配字符串的开头。
例如:在 abc 中使用表达式 ^a 会得到结果 a。但如果使用 ^b 将匹配不到任何结果。因为在字符串 abc 中并不是以 b 开头。
例如:^(T|t)he 匹配以 The 或 the 开头的字符串。
(T|t)he => The car is parked in the garage.
“$”号:同理于 ^ 号,$ 号用来匹配字符是否是最后一个。
例如:(at\.)$ 匹配以 at. 结尾的字符串。
(at\.) => The fat cat. sat. on the mat.
0x04后续待更:
- 简写字符集
- 零宽度断言(前后预查)
- 标志
- 贪婪匹配与惰性匹配(Greedy vs lazy matching)