0%

我终于理解了正则表达式

参考

资源

正则表达式解决的问题

如果我们要理解一个工具, 必须先理解它在解决一个什么样的问题.

参考 30-minutes-to-learn-regex.md 我们知道

正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如正则表达式被用于:

  • 检查文本中是否含有指定的特征词
  • 找出文中匹配特征词的位置
  • 从文本中提取信息,比如:字符串的子串
  • 修改文本

试图理解

我们从最简单的开始: 从文本中提取信息,如字符串的子串

如果我们要从一个字符串中找出某个子串, 最简单的办法是什么?
没错就是直接把这个子串写出来, 这个写出来的过程我们可以称为描述子串.

如果我们要在字符串 abcd 中找到它的子串 bc, 我们就先描述一个子串 bc, 然后去让正则表达式解析器去解析并匹配它.
这个很容易理解, 但是这样理解还不够!! 我们得理解子串 bc 的真正含义!

b 是什么? 每错 b 是一个字符, c 也是一个字符, 它们都是字符,
但是如果我们要理解一个工具, 必须先理解它在解决一个什么样的问题.
bc 这两个字符解决了什么问题? 没错, 它们向正则表达式解析器描述了它们本身!

重要的事情说三次
它们向正则表达式解析器描述了它们本身
它们向正则表达式解析器描述了它们本身
它们向正则表达式解析器描述了它们本身.

很好因为bc 向正则表达式解析器描述了它们本身, 于是正则表达式解析器就找到了它们描述的子串bc,
一切都是那么自然!! 所以我们决定将类似 b c 这样的字符称为 自指描述符, 自己指代自己.

但是, 这不够强大, 比如, 我们要描述任意一个单位字符该怎么描述? 它不是 b 不是 c, 而是任意一个字符, 该怎么描述呢?
我们想想办法, 我们可以定义一个特殊的字符 . 没错就是小数点
我们告诉正则表达式解析器, 说: 你可听好了, 我给你一个字符., 它描述的是任意一个字符, 它可以指代任意一个字符.
正则表达式解析器说: 好的, 我明白了, 以后字符 . 就是指代任意一个字符! 以后我们就把 . 这个字符叫做 任意描述符 吧.

正则表达式解析器又说: 可是如果你想告诉我那个字符它只是想指代它本身可怎么办 字符 . 指代了任意一个字符, 它怎么指代指代它本身呢?
我们想想办法, 我们可以定义一个特殊的字符 \ 没错就是斜杠!
我们告诉正则表达式解析器说: 你可听好了, 我给你一个字符 \, 它描述的是将字符 \ 后的任意一个字符转义为它本身,
正则表达式解析器说: 好的, 我明白了, 以后字符 \ 就是将字符 \ 后的任意一个字符转义为它本身! 以后我们就把 \ 这个字符叫做 转义符 吧.

现在我们可以用字符 . 指代任意一个字符, 并用子串 \. 指代为字符 . 本身. 完美!

如果我们描述一个字串 .. 它描述的是什么?
有可能 aa ab zd xy …等等, 任意一个两个字符的子串,
没错, 但是如果我们描述一个子串 cd, 它描述的是什么?
没错, 就是 cd 本身,
我们可以称这个由 ..cd 的过程为坍缩.
什么坍缩了? cd.. 的子集, 所以是可能匹配的集合坍缩了.

把这里理解了, 再依此把下面两篇文章看懂, 就可以完全理解正则表达式了!