正则表达式入门

2017-11-02  本文已影响0人  珞水的大叔

定义

用来定义搜索模式的一系列字符

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的长度必须是确定的
上一篇下一篇

猜你喜欢

热点阅读