学习资料:
哈哈,购买链接,以后做书托 :)
1. 开始,零碎知识点
配合书练习的网站:Regex Pal
匹配任意字符
. 点:英文句号,一个通配符,可以匹配任意字符,但一些特殊情况下不能匹配行起始符,例如,U+000A
,也可以匹配%
或者|
1.1 捕获分组和向后引用
-
(\d)
:匹配第一个数字7,并将其捕获 -
\d
:匹配第二个数字0,但没有对其捕获 -
\1
:对捕获的数字进行方向引用,数字7
将一个目标用()
括起来,就创建捕获分组,\1
则表示引用
1.2 使用量词
-
(
:左圆括号,捕获分组的起始符 -
\\
: 反斜杠,字符组简写式的起始符,对之后的字符进行转义 -
d
:字符d,字符组的简写式的结束符,d,匹配[0-9]内任意数字 -
{
:左花括号,量词起始符 -
3
:数字3,匹配目标字符个数的最小数量 -
,
:逗号,分隔作用,这里分隔开不同的数量 -
}
:右花括号,量词结束符 -
[
:左方括号,字符组的起始符 -
.
:点号,匹配点号本身 -
-
:连接符,匹配本身 -
]
:右方括号,字符组结束符 -
?
:问号,表示量词,零个或者1个
-
)
:右圆括号,捕获分组的结束符 -
+
:加号,表示量词,一个或者多个
整个表达式含义:括号里的模式出现一次或者多次,括号里的规则是匹配三位数字或者四位数字,后面跟一个点号或者连字符
花括号包括的数字表示待查找的目标出现的次数。花括号是一种量词,本身用做元字符
问号,是另一种量词,在上面的表达式中表示连字符是可选的,也就是说连字符-
可以出现一次,也可以一次都不出现
*
星号,零个或者多个
注意:上面的表达式虽然匹配了电话字符串,但并不完全正确,因为只是匹配了3位或者4位数字,而不管是否符合电话号码的格式
改进:
(\d{3}[.-]?){2}\d{4}
改进后的含义:连续两个无括号3位数字后,每个3位数后面可以有连字符也可以没有,最后一个4位数字
1.3 括选文字符
上面一个表达式,可以匹配两种形式的电话号码字符串,开始的3位数区号,可以带括号,也可以不带括号
- 开头的脱字符
^
或者中间位置的^
,表示匹配出现在一行 起始位置的目标字符 -
(
:,捕获分组起始符 -
\(
:,表示括号(
字符本身,\
作为转义字符,(
本身有捕获分组的起始符的含义,需要转义字符 -
d{3}
:,匹配3位数字 -
\)
:,表示)
自身,与第3条同理 - **
|
:**,表示选择,可以从多个选项中选择一个。本例中就是匹配一个带括号或者不带扩号的区号
- 脱字符
^
:,匹配行起始位置 - **
\d{3}
:**,匹配3位数字 -
[.-]?
:,匹配一个可选的.
点号或者-
连字符 -
)
:,右圆括号,捕获分组结束符 -
?
:,表示之前的(\(\d{3}\)|^\d{3}[.-]?)
整个分组,都是一个可选项,可有可无 -
\d{3}
:,匹配3位数字 -
[.-]?
:,匹配一个可选的.
点号或者-
连字符 -
\d{4}
:,匹配4位数字 -
$
:,匹配行结束位置
以上正则表达式中的捕获分组并不是必需的。分组是必要的,但是捕获不需要。更好的方法是使用非捕获分组
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 匹配空白字符
-
\s
:匹配空白字符,[ \t\n\r]
,间括号内开始有空格,同作用
可以匹配:
- 空格
- 制表符
\t
- 换行符
\n
- 回车符
\r
-
\S
:匹配非空白字符,包含中文字符,[^ \t\n\r]
,同作用
2.3 匹配任意字符
去掉global
全局模式,用来得到匹配文本中第一个符合匹配项
.
点号在绝大多数情况下,都可以匹配除了行结束符外的任意字符
8个点,可以用.{8}
来代替
这个表达性具有很强的 特指性specificity
,只要是A*****T
这样形式的单词就符合条件
-
\b
:简写式匹配单词边界,不消耗任何的字符 -
A,T
:限定单词首尾字母 -
.{5}
:匹配任意5个字符 -
\b
:结束边界
.*
:匹配零个或者多个字符,在取消global
模式下,匹配换行符前的字符,也就是只匹配第一行的字符,.+
,[^\n]或者[^\n\r],
同作用。在global
模式下,.+
,[^\n]或者[^\n\r]
则匹配全部的字符
若发现不正常匹配的,将文本时的格式整理整理,删除文本中间的复制时,带的多余无用的回车符
3. 边界
断言标记边界,但并不消耗字符,字符并不会返回到结果中。断言也被称为零度宽断言zero-width assertion
。零度宽断言不匹配字符,而是匹配字符串中的位置。其中,^
和$
也叫做锚位符anchor
本章节主要学习:
- 行或者字符串的起始和结束位置
- 单词的边界(两种)
3.1 行的起始和结束
脱字符^
:匹配行或者字符的起始。根据上下文,^
会匹配行或者字符串的起始位置,也可以匹配整个文档的起始位置
$
:匹配行或者字符串结束位置
multiline模式:
多行,勾选后,整个目标文件被视为一个字符串
^How.*Country\.$
:匹配How
开头的整行。\
反斜杠的是做转义字符,对.
点号进行转义,点号被解释为字面值,也就是点号本身,而不是匹配任意字符
如果不勾选mutiline
模式,则不能匹配到图中的高亮部分,表达式无效
3.2 单词边界与非单词边界
\bTHE\b
:在勾选global
模式下,第一行两个THE
都会匹配
就像^
和$
一样,\b
是个零度宽断言,表面上会匹配空格或者是行起始,而实际上它匹配的是个零宽度的不存在的东西。第2个THE
的两边的空格并没有标亮,并不会被匹配到
读了2遍,也不是很明白
\B
:非单词边界,匹配单词首尾之外位置,例如单词或者字符串中间位置出现的字母或数字
图中有个很典型的便是倒数第2行的eye
,没有高亮
4. 最后
哈哈,单身狗,平安夜,学习知识
正则的知识点,好零碎,需要多看多练习。书一共9章,就打算一篇博客记录3章学习的知识点
本人很菜,有错误请指出
共勉 :)