1.背景介绍
在1951 年,一位名叫史蒂芬·克林(Stephen Kleene)的数学科学家发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。很长时间之后,正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展。
2.知识剖析
正则表达式简介
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
如何使用正则表达式
语法
/正则表达式主体/修饰符(可选)
其中修饰符是可选的。
举例:
方式一:直接量语法
var test = /jnshu/;
var test = /jnshu/i;
方式二:创建 RegExp 对象的语法
var test = new RegExp("jnshu");
var test = new RegExp("jnshu","i");
test()方法
test() 方法是一个正则表达式方法。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
/123456/.test("12345"); // false
/123456/.test("123456"); // true
/123456/.test("x123456y"); // true 只要包含了指定的字符串,则为true
修饰符
修饰符是影响整个正则规则的特殊符号,会对匹配结果和部分内置函数行为产生不同的效果。
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。
元字符是拥有特殊含义的字符。利用元字符,我们可以控制字符串匹配的方式,例如:只在每一行的开始或结束位置匹配指定的模式,匹配固定距离的子串,匹配不出现的字符等等。
常用元字符
\d : 匹配数字 等价于[0-9]
\D : 匹配非数字 等价于[^\d]
\s : 匹配空白符
\S : 匹配非空白符 等价于[^\s]
\w : 用于匹配字母,数字或下划线字符(例如程序中的变量字符) 等价于[A-Za-z0-9_]
\W : 用于匹配所有与\w不匹配的字符 等价于[^\w]
举例:
/\d/.test("123"); // true
/\d/.test("1ab"); // true
/\D/.test("1ab"); // true
/\D/.test("112"); // false
字符类
匹配一类字符中的一个
[abc]: a或b或c
[0-9]: 一个数字
[^0-9]: 非数字的一个字符
[a-z]: 一个字母
. : 任一字符(换行除外)
多选分支
/thi(c|n)k/ === /thi[cn]k/ // thick或think
锚点
匹配一个位置
^ :起始位置
$ :结尾位置
\b :单词边界
举例:
/^http:/ /^http:/.test("http://www.jnshu.com") //true
/\.jpg$/ /\.jpg$/.test("1.jpg") // true
/\bis\b/ /\bis\b/.test("this is tom") // true
如果要在正则表达式中使用元字符本身的话该怎么办?
转义符
使用的方法是把一个反斜杠(\)放在元字符前面,这样元字符就失去了特殊的意义,还原会它本身代表的字符意义。
举例:
/http:\/\// /http:\/\//.test("http://www.jnshu.com") // true
量词
正则表达式的量词分别是贪婪,惰性,支配性:
贪婪量词:贪婪表达式会为所有可能的模式发现尽可能多的匹配。
惰性量词: 用问号来指定,这个量词匹配满足模式所需的最少字符数。因此也称作懒惰的,最少匹配的,非贪婪的、或不贪婪的。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。
惰性量词和贪婪量词的工作方式正好是相反的。
表示这3种量词:
贪 婪 惰 性 支 配 描 述
? ?? ?+ 零次或一次出现
* *? *+ 零次或多次出现
+ +? ++ 一次或多次出现
{n} {n}? {n}+ 恰好n次出现
{n,m} {n,m}? {n,m}+ 至少n次,最多m次出现
{n,} {n,}? {n,}+ 至少n次出现
举例:
/\d*/.test("abc") // true 数字可以出现0次到无穷次,所以是对的
/\d+/.test("abc") // false 数字至少出现1次到无穷次,所以是错的
/\d+/.test("1abc") // true 数字至少出现1次到无穷次,所以是对的
/https?:/.test("http://www.jnshu.com") // true s可以出现0次到1次,所以是对的
/https?:/.test("https://www.jnshu.com") // true
/https?:/.test("httpss://www.jnshu.com") // false s后面是:所以是错的
贪婪匹配原则
在JavaScript中,正则表达式进行匹配时默认使用的是贪婪匹配原则,即尽可能多的匹配字符串。例如,使用正则表达式/1{3,4}/来匹配字符串1111111,得到的结果为:1111和111。即先匹配4个字符,然后才匹配3个字符。
3.常见问题
如何利用正则表达式获取URL中各部分的值?
4.解决方案
var url = "http://www.jnshu.com:8080/index.html?user=chenapo&age=99#home";
var reg = /(https?:)\/\/([^\/]+)(\/[^\?]*)?(\?[^#]*)?(#.*)?/;
var arr = url.match(reg);
console.log(arr);
5.编码实战
http://www.cnblogs.com/zfc2201/archive/2012/12/18/2824107.html
7.参考文献
w3school在线教程/菜鸟教程
正则表达式的量词解释
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。
在1951 年,一位名叫史蒂芬·克林(Stephen Kleene)的数学科学家发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。很长时间之后,正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展。
2.知识剖析
正则表达式简介
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
如何使用正则表达式
语法
/正则表达式主体/修饰符(可选)
其中修饰符是可选的。
举例:
方式一:直接量语法
var test = /jnshu/;
var test = /jnshu/i;
方式二:创建 RegExp 对象的语法
var test = new RegExp("jnshu");
var test = new RegExp("jnshu","i");
test()方法
test() 方法是一个正则表达式方法。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
/123456/.test("12345"); // false
/123456/.test("123456"); // true
/123456/.test("x123456y"); // true 只要包含了指定的字符串,则为true
修饰符
修饰符是影响整个正则规则的特殊符号,会对匹配结果和部分内置函数行为产生不同的效果。
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。
元字符是拥有特殊含义的字符。利用元字符,我们可以控制字符串匹配的方式,例如:只在每一行的开始或结束位置匹配指定的模式,匹配固定距离的子串,匹配不出现的字符等等。
常用元字符
\d : 匹配数字 等价于[0-9]
\D : 匹配非数字 等价于[^\d]
\s : 匹配空白符
\S : 匹配非空白符 等价于[^\s]
\w : 用于匹配字母,数字或下划线字符(例如程序中的变量字符) 等价于[A-Za-z0-9_]
\W : 用于匹配所有与\w不匹配的字符 等价于[^\w]
举例:
/\d/.test("123"); // true
/\d/.test("1ab"); // true
/\D/.test("1ab"); // true
/\D/.test("112"); // false
字符类
匹配一类字符中的一个
[abc]: a或b或c
[0-9]: 一个数字
[^0-9]: 非数字的一个字符
[a-z]: 一个字母
. : 任一字符(换行除外)
多选分支
/thi(c|n)k/ === /thi[cn]k/ // thick或think
锚点
匹配一个位置
^ :起始位置
$ :结尾位置
\b :单词边界
举例:
/^http:/ /^http:/.test("http://www.jnshu.com") //true
/\.jpg$/ /\.jpg$/.test("1.jpg") // true
/\bis\b/ /\bis\b/.test("this is tom") // true
如果要在正则表达式中使用元字符本身的话该怎么办?
转义符
使用的方法是把一个反斜杠(\)放在元字符前面,这样元字符就失去了特殊的意义,还原会它本身代表的字符意义。
举例:
/http:\/\// /http:\/\//.test("http://www.jnshu.com") // true
量词
正则表达式的量词分别是贪婪,惰性,支配性:
贪婪量词:贪婪表达式会为所有可能的模式发现尽可能多的匹配。
惰性量词: 用问号来指定,这个量词匹配满足模式所需的最少字符数。因此也称作懒惰的,最少匹配的,非贪婪的、或不贪婪的。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。
惰性量词和贪婪量词的工作方式正好是相反的。
表示这3种量词:
贪 婪 惰 性 支 配 描 述
? ?? ?+ 零次或一次出现
* *? *+ 零次或多次出现
+ +? ++ 一次或多次出现
{n} {n}? {n}+ 恰好n次出现
{n,m} {n,m}? {n,m}+ 至少n次,最多m次出现
{n,} {n,}? {n,}+ 至少n次出现
举例:
/\d*/.test("abc") // true 数字可以出现0次到无穷次,所以是对的
/\d+/.test("abc") // false 数字至少出现1次到无穷次,所以是错的
/\d+/.test("1abc") // true 数字至少出现1次到无穷次,所以是对的
/https?:/.test("http://www.jnshu.com") // true s可以出现0次到1次,所以是对的
/https?:/.test("https://www.jnshu.com") // true
/https?:/.test("httpss://www.jnshu.com") // false s后面是:所以是错的
贪婪匹配原则
在JavaScript中,正则表达式进行匹配时默认使用的是贪婪匹配原则,即尽可能多的匹配字符串。例如,使用正则表达式/1{3,4}/来匹配字符串1111111,得到的结果为:1111和111。即先匹配4个字符,然后才匹配3个字符。
3.常见问题
如何利用正则表达式获取URL中各部分的值?
4.解决方案
var url = "http://www.jnshu.com:8080/index.html?user=chenapo&age=99#home";
var reg = /(https?:)\/\/([^\/]+)(\/[^\?]*)?(\?[^#]*)?(#.*)?/;
var arr = url.match(reg);
console.log(arr);
5.编码实战
6.扩展思考
常用正则表达式有哪些?http://www.cnblogs.com/zfc2201/archive/2012/12/18/2824107.html
7.参考文献
w3school在线教程/菜鸟教程
正则表达式的量词解释
8.更多讨论
问题一 请描述一下正则表达式的特点
答:正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常强;2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。
问题二 正则表达式最常用的应用场景?
答:总体来说,正则表达式有三类主要应用:
(1)测试字符串的某个模式。例如,可以输入一个字符串进行测试看该字符串中是否存在一个电话号码模式或者一个信用卡模式,这成为数据的有效性检验。
(2)替换文本。可以再文档中使用一个正则表达式来表示特定文字,然后可以将其全部删除或者替换成别的文字。
(3)根据模式匹配从字符串中提取一个子字符串。可以用来在文本或者输入字段中查找特定的文字。
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
问题三 手机号码验证的正则表达式怎么写?
答: /(^$)|^(((\+86)|(86))?1[34578]\d{9})$/