前言
正则表达式在编程中很重要,它能够通过特定的语法规则来对字符串进行精确的模式匹配和替换操作。相比传统的字符串处理方式,正则表达式能够快速高效地完成繁琐的文本处理任务,例如数据提取、格式化、过滤、搜索等等。
hello => hello world
正则表达式是大小写敏感的
Hello => hello Hello word
元字符在正则表达式不代表他们本身的字面意思,他们都有特殊的含义。一些元字符写在方括号中的时候有一些特殊的意思
元字符例子默认使用了全局匹配
元字符 | 描述 |
---|---|
. | 句号匹配任意单个字符除了换行符。 |
[ ] | 字符种类。匹配方括号内的任意字符。 |
[^ ] | 否定的字符种类。匹配除了方括号里的任意字符 |
* | 匹配>=0个重复的在*号之前的字符。 |
+ | 匹配>=1个重复的+号前的字符。 |
? | 标记?之前的字符为可选. |
{n,m} | 匹配num个大括号之前的字符或字符集 (n <= num <= m). |
(xyz) | 字符集,匹配与 xyz 完全相等的字符串. |
| | 或运算符,匹配符号前或后的字符. |
\ | 转义字符,用于匹配一些保留的字符?[ ] ( ) { } . * + ? ^ $ \ | |
^ | 从开始行开始匹配. |
$ | 从末端开始匹配. |
.th => I love telling the truth.
在方括号中使用连字符来指定字符集的范围。 在方括号中的字符集不关心顺序。
[Tt]he => the The tthe thhe
方括号的句号就表示句号。 表达式?ar[.]
?匹配?ar.
字符串
^
?表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。[^s]iu => siu giu ziu xiu Siu
*
号匹配 在*
之前的字符出现大于等于0
次。s* => she her Show. SSggssgg
*
字符和.
字符搭配可以匹配所有的字符.*
。
*和匹配空格的符号 \s
连用可以匹配多个以0或更多个空格开头
\s*cat => the fat** cat**
+
号匹配+
号之前的字符出现 >=1 次。c.+t => the cat is fat
?
?标记在符号前面的字符为可选,即出现 0 或 1 次.c?at => the cat Cat
匹配至少两位0-9的数字,常用来限定一个或一组字符可以重复出现的次数。
[0-9]{2,} => 1 22 333 4444
匹配至少两位,最多3位的0-9数字
[0-9]{2,3} => 1 22 333 4444
匹配3位0-9数字
[0-9]{3} => 1 22 333 4444
(...)
?特征标群特征标群是一组写在?(...)
?中的子模式。(...)
?中包含的内容将会被看成一个整体,和数学中小括号( )的作用相同。
(ab)* => ab abb aa bb
|
?或运算符或运算符就表示或,用作判断条件
dog|cat => dog cat
在小括号中用字符|或
(a|b|c)ar => aar bar car dar tar
反斜线?\
?在表达式中用于转码紧跟其后的字符。用于指定?{ } [ ] / \ + * . $ ^ | ?
?这些特殊字符。如果想要匹配这些特殊字符则要在其前面加上反斜线?\
。
(f|c|m)at.? => The fat cat sat on the mat.
在正则表达式中,想要匹配指定开头或结尾的字符串就要使用到锚点。^
?指定开头,$
?指定结尾。
^
?用来检查匹配的字符串是否在所匹配字符串的开头。^(c|C)at =>Cat is white cat
$
号用来匹配字符是否是最后一个。
$(c|C)at =>Cat is white cat
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\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 行终止符 |
先行断言和后发断言(合称 lookaround)都属于非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们需要一个模式的前面或后面有另一个特定的模式时,就可以使用它们。
说人话 就是和之前的^和$符作用一样,都是用来寻找一个位置,左侧或右侧是否为指定表达式的一个位置
?=...
?正先行断言筛选条件为其后跟随着断言中定义的格式。
cat(?=\sis) => the cat is white cat
####?!...
?负先行断言
筛选条件为其后不跟随着断言中定义的格式。
cat(?!\sis) => the cat is white cat
?<= ...
?正后发断言筛选条件为其前跟随着断言中定义的格式。
(?<=the\s)cat => the cat is white cat
?<!...
?负后发断言筛选条件为其前不跟随着断言中定义的格式。
(?<!the\s)cat => the cat is white cat
符号 | 描述 |
---|---|
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
标志也叫模式修正符,因为它可以用来修改表达式的搜索结果。 这些标志可以任意的组合使用,它也是整个正则表达式的一部分。
修饰语?i
?用于忽略大小写。
cat => the cat is Cat
/cat/i => the cat is Cat
修饰符?g
?常用于执行一个全局搜索匹配,即(不仅仅返回第一个匹配的,而是返回全部)。
/.(at)/g => cat sat fat mat
多行修饰符?m
?常用于执行一个多行匹配。
“/.at(.)?$/gm” => The cat
cat sat
on the mat.
标志 | 描述 |
---|---|
i | 忽略大小写。 |
g | 全局搜索。 |
m | 多行修饰符:锚点元字符?^ ?$ ?工作范围在每行的起始。 |
正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。我们可以使用??
?将贪婪匹配模式转化为惰性匹配模式。
/(.*at)/ => The fat cat sat on the mat.
/(.*?at)/ => The fat cat sat on the mat.