摘要
正则语言是一种简单且直接的字符串筛选规则,具有闭包性、有限记忆、不能处理复杂配对和嵌套等性质。它们可以通过正则表达式描述,适用于快速筛选和组合灵活的场景,如手机号、邮箱格式等。然而,正则语言无法处理需要记忆历史或复杂配对的问题,如括号匹配或回文串。通过生活化的比喻和例子,可以更直观地理解正则语言的特性和局限性。
1. 正则语言是什么?
正则语言就像“简单筛选规则”能筛出来的所有字符串。它们的规则简单、直接,像用漏斗筛沙子一样,一眼就能看出符不符合。
2. 正则语言的主要性质(配比喻)
性质一:闭包性(组合能力强)
比喻:
正则语言就像乐高积木,怎么拼都还是乐高积木。
- 你可以把两个正则语言“拼在一起”(并、连接),还是正则语言。
- 你可以让一个正则语言“重复很多次”(星号),还是正则语言。
- 你可以把正则语言“反选”(补集),还是正则语言。
举例:
- “所有以a开头的串” 和 “所有以b结尾的串” 拼在一起,还是正则语言。
- “所有只含a的串”重复任意次,还是正则语言。
性质二:有限记忆(有限自动机能识别)
比喻:
正则语言就像一个“记性很差的机器人”能识别的规则。
- 机器人只有几个状态,不能记太多历史。
- 只要“看一眼当前字符”,就能决定下一步。
举例:
- 机器人能判断“是不是以ab结尾”,但不能判断“a和b数量是否相等”。
性质三:不能数复杂的东西(不会配对、不会数数)
比喻:
正则语言像一个“只会数到三的小朋友”,遇到复杂配对就懵了。
- 不能判断“左括号和右括号数量是否相等”。
- 不能判断“前面有几个a,后面就要有几个b”。
性质四:能用正则表达式写出来
比喻:
正则语言的规则都能用“简短公式”写出来,就像写数学公式一样简单。
举例:
(a|b)*
表示“任意多个a或b”。ab*
表示“一个a后面跟着任意多个b”。
性质五:操作封闭
比喻:
正则语言像一群“永远不会变种的羊”,你怎么剪、怎么拼、怎么分,还是羊。
- 并、交、补、连接、星号,这些操作下,正则语言还是正则语言。
3. 形象小故事
小明在超市当收银员,老板给了他一套“正则规则”:只收条形码是“AB”开头、长度偶数、只含数字的商品。小明只要一看条形码,就能立刻判断要不要收。
但如果老板让小明“收所有左括号和右括号数量相等的商品”,小明就懵了,因为他没法一眼看出来,这种复杂的规则就不是正则语言能搞定的了。
4. 总结口诀
- 正则语言,规则简单,组合灵活,自动机能识别。
- 复杂嵌套、配对数数,正则语言搞不定。
我们继续用生动形象的方式,深入聊聊正则语言的性质和相关例子。
5. 正则语言的“超能力”与“短板”
超能力一:快速筛选
比喻:
正则语言就像机场安检的机器,只能检查行李里有没有违禁品(比如有没有a、b、c),但不会打开行李箱一层层翻查。
举例:
- 检查“行李里有没有带a”——正则语言能搞定。
- 检查“行李里a和b数量一样多”——正则语言搞不定。
超能力二:无限重复但不记数
比喻:
正则语言像一个只会说“再来一次”的小朋友,他可以让你做“任意多次”,但不会数你做了几次。
举例:
- “a出现任意多次”——正则语言能搞定(a*)。
- “a出现恰好5次”——正则语言也能搞定(aaaaa)。
- “a出现和b一样多次”——正则语言搞不定。
超能力三:组合灵活
比喻:
正则语言像拼图游戏,几块拼图随便拼,拼出来的还是拼图。
举例:
- “所有以a开头的串” 和 “所有以b结尾的串”拼在一起,还是正则语言。
- “所有长度为偶数的串” 和 “所有不含ab的串”交集,还是正则语言。
短板一:不会配对,不会嵌套
比喻:
正则语言像一个不会玩俄罗斯方块的小朋友,遇到“左括号和右括号要配对”这种嵌套问题就懵了。
举例:
- “每个左括号都要有右括号配对”——不是正则语言。
- “字符串是回文”——不是正则语言。
6. 具体例子对比
正则语言的例子
-
所有只包含0和1的二进制串
正则表达式:(0|1)*
解释:随便拼0和1,怎么拼都行。 -
所有以01结尾的串
正则表达式:(0|1)*01
解释:随便拼0和1,最后必须是01。 -
所有长度为3的a和b串
正则表达式:(a|b)(a|b)(a|b)
解释:每一位都可以是a或b,一共三位。 -
所有不含子串“11”的二进制串
正则表达式:(0|10)*1?
解释:每次只能出现0,或者10,最后可以有一个1。
不是正则语言的例子
-
a的数量等于b的数量
集合:{ a^n b^n | n ≥ 1 }
解释:要记住前面有几个a,后面就要有几个b,正则语言做不到。 -
括号完全配对的字符串
集合:所有括号完全配对的字符串,如()、(())、()()、(()())……
解释:要记住有多少层嵌套,正则语言做不到。 -
回文串
集合:正着读和反着读一样的字符串,如aba、abba、abcba……
解释:要记住前面拼了什么,后面要和它对称,正则语言做不到。
7. 生活中的正则语言
-
手机号格式:1开头,后面10个数字。
正则表达式:1\d{10}
-
邮箱格式:字母数字+@+字母数字+.com
正则表达式:\w+@\w+\.com
-
身份证号:18位数字
正则表达式:\d{18}
这些都是正则语言,因为它们的规则简单,有限状态机就能判断。
8. 总结口诀(升级版)
- 正则语言,规则简单,有限记忆,组合灵活。
- 遇到配对、嵌套、对称、数数,正则语言就“掉线”。