浏览器 F12 控制台(Console),触手可及的人机交互,JavaScript 命令行,轻量级,随时轻松编程实践。
接到任务,给一批手机号发送一则通知,你以为会给你:
19000000003
19000000004
19000000005
实际给你的是这样的:
本次活动相关人员:张三,男,19000000003,1980年出生;李四,男,19000000004;王五,女,19000000005,优秀员工......
我们会如何表达想要的?
"小刘,把文本中的手机号找出来。",然后就真的都找出来了,整整齐齐。
分析一下这个表达过程
(1)一种表达方式:手机号,小刘能识别手机号。
(2)一种输入方式:一句"小刘",小刘便会竖起耳朵接收,点头示意明白。
如何向计算机表达?
同样的找到以上两点就可以表达了。
(1)一种表达方式:正则表达式。
(2)一种输入方式:控制台指令。
两点 | 人类 | 计算机 |
---|---|---|
一种表达方式 | 手机号 | 正则表达式 |
一种输入方式 | 耳朵 | 控制台指令 |
正则表达式
计算机语言文法、状态机这些计算理论为人类表达文本的模式提供了强大的支持。正则表达式,也就是规则表达式,你描述规则,我为你匹配。因此,只要学会如何描述想要的文本的规则,剩下的就可以交给计算机了。
来看几个简单的表达:
\d :表示一个数字
\d? : 表示零个或一个数字
\d+ : 表示一至多个数字
\d* : 表示零至多个数字
\d{11}:表示 11 个数字
1\d{10}:表示 1 后边再 10 个数字
输入方式
在控制台,使用"/正则表达式/"形式表达正则表达式,使用 match 来获取匹配。
来看看完成这个示例中手机号提取的指令,我们选择简单一点的正则表达式\d{11}
。
var t = "本次活动相关人员:张三,男,19000000003,1980年出生;李四,男,19000000004;王五,女,19000000005,优秀员工......";
var r = t.match(/\d{11}/g);
console.log(r)
至于更精准的表达,更多的表达方式,可以在需要时去搜索参考资料。
正多表达式还提供更多情形的表达能力,如本例中,如果是以下情形也是可以的:
(1)只需列出男的手机号
首先寻找特征并描述:手机号前边是"男,"的符合。这种要匹配的内容在指定条件的后边的称为回顾断言,表示匹配到一个结果,要回顾一下之前的是否符合条件。使用 "(?<=条件)",则可表达为:
t.match(/(?<=男,)\d{11}/g);
(2)列出优秀的手机号
同样寻找特征并描述:手机号后边是",优秀"的符合。这种要匹配的内容在指定条件的前边的称为先行断言,表示匹配到一个结果,要往前瞅瞅看是否符合条件。使用 "(?=条件)",则可表达为:
t.match(/\d{11}(?=,优秀)/g);
当然,符合条件有肯定也有否定,如等于优秀=优秀
,不等于优秀!=优秀
,肯定的称为正向,否定的称为负向。又有了正向回顾断言,负向回顾断言,正向先行断言,负向先行断言的概念。
应用
在查询功能中,经常会有批量查询某些记录的需求,如查询多个学号的信息,通常会要求在查询条件中,每行一个的输入学号,还不允许有多余的包括空格的其它符号,这样效率很低。而使用正则表达式提取,则可以允许用户任意复制文件作为查询条件,只要那些符合学号特征的包含在里边就可以完成工作。
其它
正则表达式表达能力超强,值得花点时间学会基础的表达,想想一个个从大量文本中去复制出来有多痛苦,批量匹配出来有多爽。