定义
用来定义搜索模式的一系列字符
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的长度必须是确定的 |
网友评论