Day5--RE

作者: 东方不赞 | 来源:发表于2020-03-31 21:12 被阅读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
  • 零宽指断言不占长度
  • 注意,字符串的前后:------后-----point--->---前-------
名称 表达式 备注
正向先行断言 ***(?=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)

  • 比如固定电话020-85653333的正则表达式为:(0\d{2})-(\d{8})
序号 编号 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 1 (0\d{2}) 020
2 2 (\d{8}) 85653333

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

  • 固定电话020-85653333的正则表达式为:(?<quhao>\0\d{2})-(?<haoma>\d{8})
序号 名称 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 quhao (0\d{2}) 020
2 haoma (\d{8}) 85653333

5.3 非捕获:(?:expression)

  • 标识那些不需要捕获的分组 ,可以用(?:\0\d{2})-(\d{8})不捕获原来的第一组
序号 编号 分组 内容
0 0 (0\d{2})-(\d{8}) 020-85653333
1 1 (\d{8}) 85653333

6. 反向引用

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

  • 常用于查找一些重复的内容替换指定字符

示例

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

思路:

  • \w
  • (\w) #捕获
  • (\w)\1 #调用捕获第1组,若是命名捕获,也可用\"name"调用

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

相关文章

  • Day5--RE

    正则表达式 引用自https://mp.weixin.qq.com/s/CBexZfG1DHYji_Pk6Zo38...

网友评论

    本文标题:Day5--RE

    本文链接:https://www.haomeiwen.com/subject/hngguhtx.html