正则表达式学习(上)

学习资料:

  • 《学习正则表达式》

哈哈,购买链接,以后做书托 :)

1. 开始,零碎知识点

  • 配合书练习的网站:Regex Pal

  • 匹配任意字符

. 点:英文句号,一个通配符,可以匹配任意字符,但一些特殊情况下不能匹配行起始符,例如,U+000A,也可以匹配%或者|


1.1 捕获分组和向后引用

正则表达式学习(上)_第1张图片
捕获分组,向后引用
  1. (\d):匹配第一个数字7,并将其捕获
  2. \d:匹配第二个数字0,但没有对其捕获
  3. \1:对捕获的数字进行方向引用,数字7

将一个目标用()括起来,就创建捕获分组,\1则表示引用


1.2 使用量词

正则表达式学习(上)_第2张图片
量词
  1. (:左圆括号,捕获分组的起始符
  2. \\: 反斜杠,字符组简写式的起始符,对之后的字符进行转义
  3. d:字符d,字符组的简写式的结束符,d,匹配[0-9]内任意数字
  4. {:左花括号,量词起始符
  5. 3:数字3,匹配目标字符个数的最小数量
  6. ,:逗号,分隔作用,这里分隔开不同的数量
  7. }:右花括号,量词结束符
  8. [:左方括号,字符组的起始符
  9. .:点号,匹配点号本身
  10. -:连接符,匹配本身
  11. ]:右方括号,字符组结束符
  12. ?:问号,表示量词,零个或者1个
  13. ):右圆括号,捕获分组的结束符
  14. +:加号,表示量词,一个或者多个

整个表达式含义:括号里的模式出现一次或者多次,括号里的规则是匹配三位数字或者四位数字,后面跟一个点号或者连字符

花括号包括的数字表示待查找的目标出现的次数。花括号是一种量词,本身用做元字符

问号,是另一种量词,在上面的表达式中表示连字符是可选的,也就是说连字符-可以出现一次,也可以一次都不出现

*星号,零个或者多个

注意:上面的表达式虽然匹配了电话字符串,但并不完全正确,因为只是匹配了3位或者4位数字,而不管是否符合电话号码的格式

改进:

(\d{3}[.-]?){2}\d{4}

改进后的含义:连续两个无括号3位数字后,每个3位数后面可以有连字符也可以没有,最后一个4位数字


1.3 括选文字符

正则表达式学习(上)_第3张图片
无括号区号
正则表达式学习(上)_第4张图片
有括号区号

上面一个表达式,可以匹配两种形式的电话号码字符串,开始的3位数区号,可以带括号,也可以不带括号

  1. 开头的脱字符^或者中间位置的^,表示匹配出现在一行 起始位置的目标字符
  2. (:,捕获分组起始符
  3. \(:,表示括号(字符本身,\作为转义字符,(本身有捕获分组的起始符的含义,需要转义字符
  4. d{3}:,匹配3位数字
  5. \):,表示)自身,与第3条同理
  6. ** |:**,表示选择,可以从多个选项中选择一个。本例中就是匹配一个带括号或者不带扩号的区号
  7. 脱字符^:,匹配行起始位置
  8. ** \d{3}:**,匹配3位数字
  9. [.-]?:,匹配一个可选的.点号或者-连字符
  10. ):,右圆括号,捕获分组结束符
  11. ?:,表示之前的(\(\d{3}\)|^\d{3}[.-]?)整个分组,都是一个可选项,可有可无
  12. \d{3}:,匹配3位数字
  13. [.-]?:,匹配一个可选的.点号或者-连字符
  14. \d{4}:,匹配4位数字
  15. $:,匹配行结束位置

以上正则表达式中的捕获分组并不是必需的。分组是必要的,但是捕获不需要。更好的方法是使用非捕获分组


2. 简单的模式匹配

  • 配合学习的网站:RegExr
  • 配合学习的示例文本:rime-intro.txt

2.1 零碎

  • \d:绝大多数情况下,都可以用来匹配阿拉伯数字
  • [0-9]:匹配数字,比\d更灵活,例如,[1-3],只匹配1,2,3这三个数字
  • \D:匹配非数字字符,包括空格、标点符号(引号、连字符、反斜杠、方括号)等字符;[^0-9],[^\d],同作用
  • \w:匹配字母,数字,下划线,在匹配英文字符组时,[_a-zA-Z0-9],同作用
  • \W:匹配空格、标点,其他非字母字符,非数字字符(包括中文),[^_a-zA-Z0-9],同作用,简写式就是[^\w]

2.2 匹配空白字符

正则表达式学习(上)_第5张图片
\s匹配空白符
  • \s:匹配空白字符,[ \t\n\r] ,间括号内开始有空格,同作用

可以匹配:

  1. 空格
  2. 制表符\t
  3. 换行符\n
  4. 回车符\r
  • \S:匹配非空白字符,包含中文字符,[^ \t\n\r],同作用

2.3 匹配任意字符

去掉global全局模式,用来得到匹配文本中第一个符合匹配项

正则表达式学习(上)_第6张图片
匹配 THE RIME

.点号在绝大多数情况下,都可以匹配除了行结束符外的任意字符

8个点,可以用.{8}来代替


正则表达式学习(上)_第7张图片
特执性匹配ANCYENT

这个表达性具有很强的 特指性specificity,只要是A*****T这样形式的单词就符合条件

  1. \b:简写式匹配单词边界,不消耗任何的字符
  2. A,T:限定单词首尾字母
  3. .{5}:匹配任意5个字符
  4. \b:结束边界

正则表达式学习(上)_第8张图片
匹配换行符前的字符

.*匹配零个或者多个字符,在取消global模式下,匹配换行符前的字符,也就是只匹配第一行的字符,.+[^\n]或者[^\n\r],同作用。在global模式下,.+[^\n]或者[^\n\r]则匹配全部的字符

若发现不正常匹配的,将文本时的格式整理整理,删除文本中间的复制时,带的多余无用的回车符


3. 边界

断言标记边界,但并不消耗字符,字符并不会返回到结果中。断言也被称为零度宽断言zero-width assertion。零度宽断言不匹配字符,而是匹配字符串中的位置。其中,^$也叫做锚位符anchor

本章节主要学习:

  • 行或者字符串的起始和结束位置
  • 单词的边界(两种)

3.1 行的起始和结束

脱字符^:匹配行或者字符的起始。根据上下文,^会匹配行或者字符串的起始位置,也可以匹配整个文档的起始位置

$匹配行或者字符串结束位置

multiline模式:多行,勾选后,整个目标文件被视为一个字符串

正则表达式学习(上)_第9张图片
匹配How开头Country结束的字符串

^How.*Country\.$:匹配How开头的整行。\反斜杠的是做转义字符,对.点号进行转义,点号被解释为字面值,也就是点号本身,而不是匹配任意字符

如果不勾选mutiline模式,则不能匹配到图中的高亮部分,表达式无效


3.2 单词边界与非单词边界

正则表达式学习(上)_第10张图片
匹配THE

\bTHE\b:在勾选global模式下,第一行两个THE都会匹配

就像^$一样,\b是个零度宽断言,表面上会匹配空格或者是行起始,而实际上它匹配的是个零宽度的不存在的东西。第2个THE的两边的空格并没有标亮,并不会被匹配到

读了2遍,也不是很明白


正则表达式学习(上)_第11张图片
匹配单词首尾外位置的e

\B:非单词边界,匹配单词首尾之外位置,例如单词或者字符串中间位置出现的字母或数字

图中有个很典型的便是倒数第2行的eye,没有高亮


4. 最后

哈哈,单身狗,平安夜,学习知识

正则的知识点,好零碎,需要多看多练习。书一共9章,就打算一篇博客记录3章学习的知识点

本人很菜,有错误请指出

共勉 :)

你可能感兴趣的:(正则表达式学习(上))