1、基本概念 和 定义

用一种描述性的语言来给字符串定义一个规则,你可以形象地理解正则表达式是一个“框”,凡是符合大小形状条件的字符串,都算是“匹配“了。

JS中有两种方式定义正则表达式:
  • 通过 /正则表达式/ 写出来;
  • 通过 new RegExp(' 正则表达式 ') 创建RegExp对象
var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\\-001'); //这里的两个\\因为转义,实际上是一个\ re1; // /ABC\-001/
re2; // /ABC\-001/
5
 
1
var re1 = /ABC\-001/;
2
var re2 = new RegExp('ABC\\-001');  //这里的两个\\因为转义,实际上是一个\ 
3

4
re1; // /ABC\-001/
5
re2; // /ABC\-001/

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'] --> 匹配至少一个空格、逗号或分号
11
 
1
//正常的切分代码:无法识别连续的空格
2
'a b   c'.split(' '); // ['a', 'b', '', '', 'c'] 
3

4
//正则表达式切分代码:无论空格数量都可以正常分割
5
'a b   c'.split(/\s+/); // ['a', 'b', 'c'] --> 匹配至少一个空格
6

7
//即使有逗号 , 也可以试试
8
'a,b, c  d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd'] --> 匹配至少一个空格或逗号
9

10
//再试下分号 ; 
11
'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd'] --> 匹配至少一个空格、逗号或分号

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
3
 
1
var re = /^(\d{3})-(\d{3,8})$/;
2
re.exec('010-12345'); // ['010-12345', '010', '12345']
3
re.exec('010 12345'); // null

如果正则表达式中定义了组,可以在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']
2
 
1
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])$/;
2
re.exec('19:05:30'); // ['19:05:30', '19', '05', '30']

上面的正则表达式可以识别合法的时间,但有些时候,正则表达式也无法完全做到验证,比如识别日期,像2-30此类还识别不了,或者写出来非常困难。

3.3 贪婪匹配

正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。

var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', ''] //由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
4
 
1
var re = /^(\d+)(0*)$/;
2
re.exec('102300'); // ['102300', '102300', '']
3

4
//由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让 \d+ 非贪婪匹配,才能把后面的0匹配出来,加个 ? 就可以让 \d+ 采用非贪婪匹配:

var re = /^(\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
2
 
1
var re = /^(\d+?)(0*)$/;
2
re.exec('102300'); // ['102300', '1023', '00']

3.4 全局搜索

g     表示全局匹配
i     表示忽略大小写
m     表示多行匹配
var r1 = /test/g;
// 等价于:
var r2 = new RegExp('test', 'g');
3
 
1
var r1 = /test/g;
2
// 等价于:
3
var r2 = new RegExp('test', 'g');

全局匹配可以多次执行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,直到结束仍没有匹配到
17
 
1
var s = 'JavaScript, VBScript, JScript and ECMAScript';
2
var re=/[a-zA-Z]+Script/g;
3

4
// 使用全局匹配:
5
re.exec(s); // ['JavaScript']
6
re.lastIndex; // 10
7

8
re.exec(s); // ['VBScript']
9
re.lastIndex; // 20
10

11
re.exec(s); // ['JScript']
12
re.lastIndex; // 29
13

14
re.exec(s); // ['ECMAScript']
15
re.lastIndex; // 44
16

17
re.exec(s); // null,直到结束仍没有匹配到

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('测试通过!');
}
26
 
1
'use strict';
2
var re = /^[a-zA-Z][a-zA-Z\d\_\.]*@[a-zA-Z\d]+\.[a-zA-Z]{2,3}$/;
3

4
// 测试:
5
var
6
    i,
7
    success = true,
8
    should_pass = ['someone@gmail.com', 'bill.gates@microsoft.com', 'tom@voyager.org', 'bob2015@163.com'],
9
    should_fail = ['test#gmail.com', 'bill@microsoft', 'bill%gates@ms.com', '@voyager.org'];
10
for (i = 0; i < should_pass.length; i++) {
11
    if (!re.test(should_pass[i])) {
12
        alert('测试失败: ' + should_pass[i]);
13
        success = false;
14
        break;
15
    }
16
}
17
for (i = 0; i < should_fail.length; i++) {
18
    if (re.test(should_fail[i])) {
19
        alert('测试失败: ' + should_fail[i]);
20
        success = false;
21
        break;
22
    }
23
}
24
if (success) {
25
    alert('测试通过!');
26
}

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('测试成功!');
}
x
 
1
'use strict';
2
var re = /^\<([a-zA-Z\s]+)\>\s([a-zA-Z][a-zA-Z\d\_\.]*@[a-zA-Z\d]+\.[a-zA-Z]{2,3})$/;
3

4
// 测试:
5
var r = re.exec('<Tom Paris> tom@voyager.org');
6
if (r === null || r.toString() !== ['<Tom Paris> tom@voyager.org', 'Tom Paris', 'tom@voyager.org'].toString()) {
7
    alert('测试失败!');
8
}
9
else {
10
    alert('测试成功!');
11
}


03标准对象-02-RegExp 正则表达式的更多相关文章

  1. RegExp正则表达式规则以及常用正则表达式

    html,body { font-family: "SF UI Display", ".PingFang SC", "PingFang SC" ...

  2. MySQL中REGEXP正则表达式使用大全

    REGEXP在mysql是用来执行正则表达式的一个函数 像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看. ...

  3. MySQL学习笔记:regexp正则表达式

    在MySQL中,模糊搜索的时候主要用两种方式: 1.like2.regexp + 正则表达式 性能优于like 正则表达式描述了一组字符串. 最简单的正则表达式是不含任何特殊字符的正则表达式.例如,正 ...

  4. ECMAScript基本对象——RegExp 正则表达式对象

    含义:定义字符串的组成规则 使用: 1.定义单个字符:[ ] [a] 表示有一个字符是  小写的a [ab] 表示有一个字符是  小写的a或者b [a-z] 表示有一个字符是  小写的a到z [a-z ...

  5. Mysql常用sql语句(21)- regexp 正则表达式查询

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 正则的强大不言而喻,Mysql中也提供了 reg ...

  6. RegExp正则表达式(三)–js中正则表达式的定义

    在js中,RegExp正则表达式的定义有两种方式:一种是普通方式,另一种是构造函数方式.无论是那种定义正则表达式的方式,它们都会返回RegExp对象. 普通方式定义正则表达式的格式 语法: var 变 ...

  7. JS获取url中query_str JavaScript RegExp 正则表达式基础详谈

    面我们举例一个URL,然后获得它的各个组成部分:http://i.cnblogs.com/EditPosts.aspx?opt=1 1.window.location.href(设置或获取整个 URL ...

  8. 笔记007:对象——RegExp正则表达式对象

    1.RegExp 一个用于匹配的模式文本 用0个或多个修饰符描述的匹配模式细节 RegExp对象的创建形式 用内建构造器创建    var re = new RegExp("j.*t&quo ...

  9. Matlab—regexp正则表达式

    原文转自:http://blog.csdn.net/yf210yf/article/details/42421523 关于正则表达式的基本知识 正则表达式就是一个表达式(也是一串字符),它定义了某种字 ...

随机推荐

  1. .net core 2.0学习笔记(五):程序配置&ConfigurationManager

    配置组件是.net framework中非常常用的功能.在创建.net framework 工程时,系统不仅会自动生成app.config文件,而且还提供了非常强大的访问类库.但是这些好东西,在.ne ...

  2. Linux环境下安装禅道

      1.下载禅道包 http://dl.cnezsoft.com/zentao/7.3/ZenTaoPMS.7.3.stable.zbox_64.tar.gz http://dl.cnezsoft.c ...

  3. R的数据图形

    R支持4种图形类型: base graphics, grid graphics, lattice graphics,  ggplot2. Base graphics是R的默认图形系统. 一.  基本图 ...

  4. 关于FPU

    关于FPU,比较运算有几个地方需要关注,mark一下. he result of the comparison is reported in the condition codes field of ...

  5. HttpClient调用api

    /// <summary> /// 模拟调用API /// </summary> /// <param requestUrl="">请求地址&l ...

  6. oracle撤销表空间和回滚段

    /* 撤销表空间 */ 通过使用撤销技术,能够为Oracle数据库提供以下功能: * 使用ROLLBACK语句撤销事务 * 进行数据库恢复 * 提供数据的读一致性 Oracle强烈建议DBA在Orac ...

  7. Centos 6.5 安装 python3.6.2、pip9.0.1、ipython6.1

    说明:由于Cenots 6.5 默认是安装的 python 2.6.6  要想同一台主机使用多个python版本,不能影响原来的版本,因为系统很多还依赖于python,比如 yum    python ...

  8. NTP原理及配置使用

    一.NTP简介 1.NTP简介   NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC,其精 ...

  9. SpringMVC(一)--基础、REST、@RequestParam、POST请求乱码等

    1.SpringMVC基本概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 ...

  10. Oracle异常汇总

    持续更新中,可参见https://hnuhell.gitbooks.io/oracle_errmg/content/或https://hnuhell.github.io/Oracle_ERRMG/上的 ...