参考
资源
正则表达式解决的问题
如果我们要理解一个工具, 必须先理解它在解决一个什么样的问题.
参考 30-minutes-to-learn-regex.md 我们知道
正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如正则表达式被用于:
- 检查文本中是否含有指定的特征词
- 找出文中匹配特征词的位置
- 从文本中提取信息,比如:字符串的子串
- 修改文本
试图理解
我们从最简单的开始: 从文本中提取信息,如字符串的子串
如果我们要从一个字符串中找出某个子串, 最简单的办法是什么?
没错就是直接把这个子串写出来, 这个写出来的过程我们可以称为描述子串
.
如果我们要在字符串 abcd
中找到它的子串 bc
, 我们就先描述一个子串 bc
, 然后去让正则表达式解析器去解析并匹配它.
这个很容易理解, 但是这样理解还不够!! 我们得理解子串 bc
的真正含义!
b
是什么? 每错 b
是一个字符, c
也是一个字符, 它们都是字符,
但是如果我们要理解一个工具, 必须先理解它在解决一个什么样的问题.b
和 c
这两个字符解决了什么问题? 没错, 它们向正则表达式解析器描述了它们本身!
重要的事情说三次
它们向正则表达式解析器描述了它们本身
它们向正则表达式解析器描述了它们本身
它们向正则表达式解析器描述了它们本身.
很好因为b
和 c
向正则表达式解析器描述了它们本身, 于是正则表达式解析器就找到了它们描述的子串bc
,
一切都是那么自然!! 所以我们决定将类似 b
c
这样的字符称为 自指描述符
, 自己指代自己.
但是, 这不够强大, 比如, 我们要描述任意一个单位字符该怎么描述? 它不是 b
不是 c
, 而是任意一个字符, 该怎么描述呢?
我们想想办法, 我们可以定义一个特殊的字符 .
没错就是小数点
我们告诉正则表达式解析器, 说: 你可听好了, 我给你一个字符.
, 它描述的是任意一个字符, 它可以指代任意一个字符.
正则表达式解析器说: 好的, 我明白了, 以后字符 .
就是指代任意一个字符! 以后我们就把 .
这个字符叫做 任意描述符
吧.
正则表达式解析器又说: 可是如果你想告诉我那个字符它只是想指代它本身可怎么办 字符 .
指代了任意一个字符, 它怎么指代只指代它本身呢?
我们想想办法, 我们可以定义一个特殊的字符 \
没错就是斜杠!
我们告诉正则表达式解析器说: 你可听好了, 我给你一个字符 \
, 它描述的是将字符 \
后的任意一个字符转义为它本身,
正则表达式解析器说: 好的, 我明白了, 以后字符 \
就是将字符 \
后的任意一个字符转义为它本身! 以后我们就把 \
这个字符叫做 转义符
吧.
现在我们可以用字符 .
指代任意一个字符, 并用子串 \.
指代为字符 .
本身. 完美!
如果我们描述一个字串 ..
它描述的是什么?
有可能 aa
ab
zd
xy
…等等, 任意一个两个字符的子串,
没错, 但是如果我们描述一个子串 cd
, 它描述的是什么?
没错, 就是 cd
本身,
我们可以称这个由 ..
到 cd
的过程为坍缩.
什么坍缩了? cd
是 ..
的子集, 所以是可能匹配的集合坍缩了.
把这里理解了, 再依此把下面两篇文章看懂, 就可以完全理解正则表达式了!