生信星球培训第四十八期

Day5--RE

2020-03-31  本文已影响0人  东方不赞

正则表达式

引用自https://mp.weixin.qq.com/s/CBexZfG1DHYji_Pk6Zo38w

1. 元字符

元字符 意义 反义的表达
. 匹配除换行符外所有字符
\w 字母、数字、下划线、汉字 \W
\s 任意空白符 \S
\d 数字 \D
\b 单词的开始或结束 \B
^ 字符串的开始 [^]
$ 字符串的结束

示例

匹配有 abc 开头的字符串

\babc或^abc  

匹配8位数字的QQ号码

^\d\d\d\d\d\d\d\d

匹配1开头的手机号码

^1\d\d\d\d\d\d\d\d\d\d

2. 重复限定符

为了解决上面示例的冗余,使用重复限定符

语法 重复次数
? 0或1次
* 0或多次
+ 1或多次
{n} n次
{n,} n或更多
{n,m} n到m次

示例

匹配8位数字的QQ号码

^\d{8}$

匹配1开头的手机号码

^1\d{10}$

匹配银行卡号是14~18的数字

^\d{14,18}$

匹配以a开头,0个或多个b结尾的字符串

^ab*$

3. 分组、转义、条件或、区间

3.1 使用小括号进行分组

匹配以0或多个ab开头的字符串

^(ab)*

3.2 对小括号进行转义

匹配以0或多个(ab)开头的字符串

^(\(ab\))*

3.3 条件或:|

匹配联通手机号(联通手机号前三位: 130/131/132/155/156/185/186/145/176 )

^(130|131|132|155|156|185|186|145|176)\d{8}$

3.4 对上式化简,可以使用区间工具

区间 限定
[0-9] 0到9
[165] 1,5,6
[A-C] A到C
[AC] A,C

化简上式

^(13[0-2]|15[56]|18[56]|145|176)\d{8}$

4. 零宽断言

名称 表达式 备注
正向先行断言 ***(?=pattern) 与pattern匹配则返回***
正向后行断言 (?<=pattern)*** 与pattern匹配则返回***
负向先行断言 ***(?!pattern) 负向指“非”,与pattern不匹配则返回***
负向后行断言 (?<!pattern)*** 负向指“非”,与pattern不匹配则返回***

示例

#匹配"<span class="read-count">阅读数:641</span>"中的641
\d+(?=</span>)  #正向先行断言
(?<=<span class=\"read-count\">阅读数:)\d+  #正向后行断言
#“我爱祖国,我是祖国的花朵”
祖国(?!的花朵)  #负向先行断言,匹配不是'的花朵'的祖国
(?<!我是)祖国  #负向后行断言,匹配不是“我是”的祖国

5. 捕获与非捕获

捕获组:匹配子表达式的内容,把匹配结果保存到内存中中数字编号或显示命名的组里,以深度优先进行编号,之后可以通过序号或名称来使用这些匹配结果

5.1 数字编号捕获组:(expression)

序号 编号 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 1 (0\d{2}) 020
2 2 (\d{8}) 85653333

5.2 命名编号捕获组: (?<name>expression)

序号 名称 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 quhao (0\d{2}) 020
2 haoma (\d{8}) 85653333

5.3 非捕获:(?:expression)

序号 编号 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 1 (\d{8}) 85653333

6. 反向引用

捕获会返回一个捕获组,并保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用

示例

查找一串字母"aabbbbgbddesddfiid"里成对的字母

思路:

7. 贪婪与非贪婪

7.1 贪婪

贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。

文本:61762828 176 2991 44 871
贪婪模式:\d{3,6}#假如字符串里有6个数字可以匹配,那它会全部匹配到。
匹配结果:617628
匹配结果:176
匹配结果:2991
匹配结果:871

7.2 贪婪之间的优先度

文本:61762828 176 2991 87321
贪婪模式:(\d{1,2})(\d{3,4})
匹配结果:617628
匹配结果:2991
匹配结果:87321

7.3 非贪婪(懒惰)

懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配方式叫做懒惰匹配。

代码 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
文本:61762828 176 2991 87321
贪婪模式:(\d{1,2}?)(\d{3,4})
匹配结果:61762
匹配结果:2991
匹配结果:87321
上一篇 下一篇

猜你喜欢

热点阅读