定义
用来定义搜索模式的一系列字符
A regular expression, regex or regexp (sometimes called a rational expression) is, in theoretical computer science and formal language theory, a sequence of characters that define a search pattern. Usually this pattern is then used by string searching algorithms for "find" or "find and replace" operations on strings.
----来自维基百科
常见的样子
#perl
/H.+W.+!/si
#python
matchObj = re.search( r'H.+W.+!', str, re.S|re.I )
好用的参考网站
https://regex101.com/
四种用途
在一个字符串里寻找一个子串(一个符合正则表达式定义的子串)。引申而来的用途有如下四种:
匹配、捕获、替换、分割
六个必要的概念
注意:以下的符号的表述方式采用 perl 里的语法,但尽可能的会保证各种语言都一致
元字符
与字面意思不同的字符,是正则表达式语法的基石
正则表达式元字符.png
匹配符
匹配一个字符(character)
除了元字符中的 . 和 [ ] 以外,常见匹配符有:
符号 |
含义 |
\n |
换行 |
\s |
[ \f\n\r\t] |
\S |
\s的补集 |
\d |
[0-9] |
\D |
\d的补集 |
\w |
[a-zA-Z0-9_] |
\W |
\w的补集 |
这些匹配符都可以放在 [ ] 里面,例如:[\s\S] 表示匹配任意一个字符
分组
分组与捕获
符号 |
含义 |
( ) |
用于分组,并且能用于捕获小括弧内匹配到的子串 |
(?: ) |
用于分组,但不捕获里面匹配到的子串 |
常见的用法有两种:
1、与 | 一起使用。例如:a(b|c)d 可以匹配字符串 abd 或 acd
2、与量词连用。例如:a(bc)+d 可以匹配字符串 abcbcd
量词
量词、贪婪与非贪婪
量词:跟在匹配符或分组之后,表示匹配符或分组重复出现若干次
贪婪:尽可能匹配更长的内容
非贪婪:尽可能匹配更短的内容
默认的是贪婪模式;非贪婪模式需要在量词后加?
符号 |
含义 |
贪婪 or 非贪婪 |
* |
出现了0次或多次 |
贪婪 |
+ |
出现了1次或多次 |
贪婪 |
? |
出现了0次或1次 |
贪婪 |
{n} |
出现了n次 |
贪婪 |
{n, } |
出现了至少n次 |
贪婪 |
{n, m} |
出现了至少n次,并且不超过m次 |
贪婪 |
*? |
出现了0次或多次 |
非贪婪 |
+? |
出现了1次或多次 |
非贪婪 |
?? |
出现了0次或1次 |
非贪婪 |
{n}? |
出现了n次 |
非贪婪 |
{n, }? |
出现了至少n次 |
非贪婪 |
{n, m}? |
出现了至少n次,并且不超过m次 |
非贪婪 |
贪婪与非贪婪的区别主要体现在捕获与替换中。
例如:对于字符串 niconiconi ,表达式 (n.*o) 捕获到的是 niconico,而表达式 (n.*?o) 捕获的是 nico
定位
匹配两个字符之间的位置(boundary)
符号 |
含义 |
^ |
匹配字符串的开始。如果存在修饰符m,那么它可以匹配行首 |
$ |
匹配字符串的结尾。如果存在修饰符m,那么它可以匹配行尾 |
\b |
Match a \w\W or \W\w boundary |
\B |
Match except at a \w\W or \W\w boundary |
\A |
Match only at beginning of string |
\Z |
Match only at end of string, or before newline at the end |
\z |
Match only at end of string |
修饰符
一定程度上改变正则表达式的匹配逻辑,它一般出现在正则表达式之外。
符号 |
含义 |
i |
使正则表达式里出现的英文字母可以匹配其大写和小写 |
m |
使正则表达式里的 ^ 和 $ 可以匹配行首和行尾 |
s |
使正则表达式里的 . 可以匹配 \n |
x |
使正则表达式里的空格不匹配任何内容,这样,可以使用空格来调整表达式的格式,使之更容易阅读。如果需要匹配空格,可以在空格前面加转义符 |
g |
全局匹配,用于捕获和替换,只在 perl 中有效 |
进阶
优先级
符号 -- 优先级从高到低 |
[ ] |
量词 |
( ) |
| |
匿名捕获与命名捕获
1. 匿名捕获,捕获到的内容放在数组里
2. 命名捕获,捕获到的内容放在Map里
复杂定位 (零宽断言)
符号 |
含义 |
(?=pattern) |
匹配一个位置,它后面匹配pattern |
(?!pattern) |
匹配一个位置,它后面不匹配pattern |
(?<=pattern) |
匹配一个位置,它前面匹配pattern。注意:这个pattern的长度必须是确定的 |
(?<!pattern) |
匹配一个位置,它前面不匹配pattern。注意:这个pattern的长度必须是确定的 |