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. js 小数计算为啥和想象中不一样!

    今天遇到了一个比较有趣的事,如果要你计算0.1+0.2等于多少你会怎么回答? "0.3啊!"你可能都不会考虑.我也一样,当a=0.1,b=0.2时 if(a+b === 0.3){ ...

  2. String与Date(java.util.Date)互转(转)

    http://yunnick.iteye.com/blog/1074495 一.String与Date(java.util.Date)互转 1.1 String -> Date String d ...

  3. 【Hadoop】NameNode

    一.背景介绍 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(partition)并存储到多台单独的计算机上.管理网络中跨多台计算机存储的文件系统称为分布式文件系统(dist ...

  4. BotVS开发基础—2.5 策略交互

    一.代码部分 isOpen = False; # 是否 开仓 price = 0; # 全局变量 价格 amount = 0; # 全局变量 下单量 def exec_command(command) ...

  5. 最新spring官网(spring.io)下载方法

    这里介绍的是用于WEB开发的spring-frame框架的下载方法. 如果想下载其他的spring产品,直接进入http://projects.spring.io,选择自己要的即可.下载方法同下. 要 ...

  6. maven 搭建 SpringMVC + MyBatis(1)

    ·做了两年多Java Web一多半的项目都是SSM架构的,只搭建过两次,趁着周末做个总结整理. Eclipse搭建Maven项目 1.new project  --> Maven project ...

  7. 聊一聊Redis的数据结构

    如果没有记错的话,应该是在两个月前把 我们经常看到此类的文章: Redis的五种数据结构 Redis的数据结构以及对应的使用场景 其实以数据结构这个词去说明Redis的String.Hash.List ...

  8. java实现邮箱找密码

    SMTP,POP3,IMAP POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电 ...

  9. 打造基于Clang LibTooling的iOS自动打点系统CLAS(三)

    1. 源码变换 第一章我们提到过,CLAS的本质是对源码做一次非常简单的变换(有些文章里称作变形),即Source-Source-Transformation,将打点代码精确地插入到目标函数的首部,保 ...

  10. Web桌面应用框架2:著名的WEB桌面应用分析

    前一篇文章里,分析了包括NW.js和electron这种纯JS框架在内的几种Web桌面应用开发方式,实际上还有一种最古老的方式,那就是嵌入WebView的方式. 嵌入WebView的方式和整个程序都是 ...