03标准对象-02-RegExp 正则表达式
2017-03-27 21:17
274 查看
1、基本概念 和 定义
用一种描述性的语言来给字符串定义一个规则,你可以形象地理解正则表达式是一个“框”,凡是符合大小形状条件的字符串,都算是“匹配“了。JS中有两种方式定义正则表达式:通过 /正则表达式/ 写出来;
通过 new RegExp(' 正则表达式 ') 创建RegExp对象
var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\\-001'); //这里的两个\\因为转义,实际上是一个\
re1; // /ABC\-001/
re2; // /ABC\-001/
[/code]
2、匹配规则
在正则表达式中,如果直接给出字符,表示精确匹配,其他的根据规则不同匹配不同内容。特殊符号用转义字符 \ 表示。例如我们想匹配如 ' 010-12345 ' 这样的号码,我们的正则表达式可以是: \d{3}\-\d{3, 8}:短横线前要求3个数字,之后要求3到8个数字。
2.1 匹配内容
\d | 匹配一个数字 |
\w | 匹配一个字母或数字 |
\s | 匹配一个空格 |
. | (点)可以匹配任意字符 |
2.2 基本匹配
* | 表示任意个字符(包括0个) |
+ | 表示至少一个字符 |
? | 表示0个或1个字符 |
{n} | 表示n个字符 |
{n,m} | 表示n-m个字符 |
2.3 高级匹配
要做更精确地匹配,可以使用中括号 [ ] 表示范围[0-9a-zA-Z\_] | 匹配一个数字、字母或者下划线 |
[0-9a-zA-Z\_]+ | 匹配至少由一个数字、字母或下划线组成的字符串,如 'a100', '0_Z' |
[a-zA-Z\_\$][0-9a-zA-Z\_\$]* | 可以匹配由字母或下划线、$开头,后接任意一数字、字母、下划线、$组成的字符串,也就是JS允许的变量名 |
[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19} | 相比以上,更加精确地限制了变量的长度是1-20个字符(前面1个字符,后面最多19个字符) |
A | B | 匹配A或B,如 (J | j)S 可以匹配 'JS' 或 'jS' |
^ | 表示行的开头,如 ^\d 表示必须数字开头 |
$ | 表示行的结尾,如 \d$ 表示必须以数字结尾 |
3、正则表达式的应用
3.1 切分字符串
//正常的切分代码:无法识别连续的空格
'a b c'.split(' '); // ['a', 'b', '', '', 'c']
//正则表达式切分代码:无论空格数量都可以正常分割
'a b c'.split(/\s+/); // ['a', 'b', 'c'] --> 匹配至少一个空格
//即使有逗号 , 也可以试试
'a,b, c d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd'] --> 匹配至少一个空格或逗号
//再试下分号 ;
'a,b;; c d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd'] --> 匹配至少一个空格、逗号或分号
[/code]
3.2 分组(子串提取)
正则表达式还可以提取子串,用括号 ( ) 表示的就是要提取的分组。比如:^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
[/code]
如果正则表达式中定义了组,可以在RegExp对象中使用exec()方法提取子串,匹配成功后,返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串;匹配失败会返回null。
对于提取子串,再看一个长点的例子:
var re = /^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$/;
re.exec('19:05:30'); // ['19:05:30', '19', '05', '30']
[/code]
上面的正则表达式可以识别合法的时间,但有些时候,正则表达式也无法完全做到验证,比如识别日期,像2-30此类还识别不了,或者写出来非常困难。
3.3 贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
//由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
[/code]
必须让 \d+ 非贪婪匹配,才能把后面的0匹配出来,加个 ? 就可以让 \d+ 采用非贪婪匹配:
var re = /^(\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
[/code]
3.4 全局搜索
g | 表示全局匹配 |
i | 表示忽略大小写 |
m | 表示多行匹配 |
var r1 = /test/g;
// 等价于:
var r2 = new RegExp('test', 'g');
[/code]
全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。当我们指定g标志后,每次运行exec(),正则表达式本身会更新lastIndex属性,表示上次匹配到的最后索引:
var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;
// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10
re.exec(s); // ['VBScript']
re.lastIndex; // 20
re.exec(s); // ['JScript']
re.lastIndex; // 29
re.exec(s); // ['ECMAScript']
re.lastIndex; // 44
re.exec(s); // null,直到结束仍没有匹配到
[/code]
4、思维拓展练习
4.1 尝试写一个验证Email地址的正则表达式
Email地址验证的正则表达式,要求只能字母开头'use strict';
var re = /^[a-zA-Z][a-zA-Z\d\_\.]*@[a-zA-Z\d]+\.[a-zA-Z]{2,3}$/;
// 测试:
var
i,
success = true,
should_pass = ['someone@gmail.com', 'bill.gates@microsoft.com', 'tom@voyager.org', 'bob2015@163.com'],
should_fail = ['test#gmail.com', 'bill@microsoft', 'bill%gates@ms.com', '@voyager.org'];
for (i = 0; i < should_pass.length; i++) {
if (!re.test(should_pass[i])) {
alert('测试失败: ' + should_pass[i]);
success = false;
break;
}
}
for (i = 0; i < should_fail.length; i++) {
if (re.test(should_fail[i])) {
alert('测试失败: ' + should_fail[i]);
success = false;
break;
}
}
if (success) {
alert('测试通过!');
}
[/code]
4.2 验证并提取出带名字的Email地址
'use strict';
var re = /^\<([a-zA-Z\s]+)\>\s([a-zA-Z][a-zA-Z\d\_\.]*@[a-zA-Z\d]+\.[a-zA-Z]{2,3})$/;
// 测试:
var r = re.exec('<Tom Paris> tom@voyager.org');
if (r === null || r.toString() !== ['<Tom Paris> tom@voyager.org', 'Tom Paris', 'tom@voyager.org'].toString()) {
alert('测试失败!');
}
else {
alert('测试成功!');
}
[/code]
相关文章推荐
- 02_03 JSP内置对象之page
- 黑马程序员--03.Java面向对象--02.【static关键字】【main方法】【静态成员】
- 02-03.类和对象 Classes and Objects
- 03标准对象-01-Date和JSON
- 黑马程序员--03.反射--02【Class类对象】【Class对象的获取方式】
- js中使用正则表达式(三)RegExp对象构造函数属性介绍
- 正则表达式RegExp对象的方法
- 03-02 创建和编辑AutoCAD实体(二) 创建对象(1)
- JavaScript正则表达式RegExp对象
- 01-其他对象API(System类)123 02-其他对象API(Runtime类) 03-其他对象API(Math类)
- 03-02 创建和编辑AutoCAD实体(二) 创建对象(2)
- jsp内置对象【03】request详解【02】
- 02---jsp内置对象03(response对象)
- 03-02 创建和编辑AutoCAD实体(二) 创建对象(3)
- JQuery源码分析-02正则表达式-RegExp-常用正则表达式
- 黑马程序员--03.面向对象--02.子类和父类成员变量的关系【个人总结】
- 廖雪峰js教程学习记录——标准对象之RegExp
- JavaScript RegExp 对象 正则表达式
- 02-常用对象API(集合框架-体系&共性功能) 03-常用对象API(集合框架-方法演示_1) 04-常用对象API(集合框架-方法演示_2)1 2 3 4
- APUE读书笔记-02UNIX标准和实现-03UNIX实现