要做更精确地匹配,可以用[]表示范围,比如:

[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100’,’0_Z’,’js2015’等等;

[a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下划线、开头,后接任意个由一个数字、字母或者下划线、开头,后接任意个由一个数字、字母或者下划线、组成的字符串,也就是JavaScript允许的变量名;

[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配'JavaScript'、'Javascript'、'javaScript'或者'javascript'

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。

你可能注意到了,js也可以匹配’jsp’,但是加上^js$就变成了整行匹配,就只能匹配’js’了。

在JavaScript中使用正则表达式了。

JavaScript有两种方式创建一个正则表达式: 
第一种方式是直接通过/正则表达式/写出来,第二种方式是通过new RegExp(‘正则表达式’)创建一个RegExp对象。 
两种写法是一样的:

var re1 = /ABC\-001/;
var re2 = new RegExp('ABC\\-001');re1; // /ABC\-001/
re2; // /ABC\-001/
  • 1
  • 2
  • 3
  • 4
  • 5

注意,如果使用第二种写法,因为字符串的转义问题,字符串的两个\实际上是一个\。

先看看如何判断正则表达式是否匹配:

var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
  • 1
  • 2
  • 3
  • 4

RegExp对象的test()方法用于测试给定的字符串是否符合条件。

切分字符串

用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:

'a b   c'.split(' '); // ['a', 'b', '', '', 'c']
  • 1
  • 2

嗯,无法识别连续的空格,用正则表达式试试:

'a b   c'.split(/\s+/); // ['a', 'b', 'c']
  • 1
  • 2

无论多少个空格都可以正常分割。加入,试试:

'a,b, c  d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd']
  • 1
  • 2

再加入;试试:

'a,b;; c  d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']
  • 1
  • 2

如果用户输入了一组标签,下次记得用正则表达式来把不规范的输入转化成正确的数组。

分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

^(\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
  • 1
  • 2
  • 3

如果正则表达式中定义了组,就可以在RegExp对象上用exec()方法提取出子串来。

exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。

exec()方法在匹配失败时返回null。

贪婪匹配

需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:

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

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

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

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

全局搜索

JavaScript的正则表达式还有几个特殊的标志,最常用的是g,表示全局匹配:

var r1 = /test/g;
// 等价于:
var r2 = new RegExp('test', 'g');
  • 1
  • 2
  • 3

全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。当我们指定g标志后,每次运行exec(),正则表达式本身会更新lastIndex属性,表示上次匹配到的最后索引:

var s = 'JavaScript, VBScript, JScript and ECMAScript';
var re=/[a-zA-Z]+Script/g;// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10re.exec(s); // ['VBScript']
re.lastIndex; // 20re.exec(s); // ['JScript']
re.lastIndex; // 29re.exec(s); // ['ECMAScript']
re.lastIndex; // 44re.exec(s); // null,直到结束仍没有匹配到
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

全局匹配类似搜索,因此不能使用/^…$/,那样只会最多匹配一次。 
正则表达式还可以指定i标志,表示忽略大小写,m标志,表示执行多行匹配。

练习

请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email:

'use strict';var re = /^[a-zA-Z0-9\.]+@\w+\.\w+$/;// 测试:
vari,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('测试通过!');
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

版本二可以验证并提取出带名字的Email地址:

'use strict';var re=/^<([\w\s]+)>\s+([\w]+@\w+\.\w+)$/;
// 测试:
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('测试成功!');
}

RegExp表达式 Email地址验证相关推荐

  1. 关于Email地址验证的正则表达式

    iamlaosong文 网上提供的Email地址验证的正则表达式是:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 表达式中比较难以理解的就是其中的[-+. ...

  2. Java学习笔记——Email地址验证

    案例分析: 输入一个Email地址,然后使用正则表达式验证该Email地址是否正确. 代码如下 package demo;public class JavaAPIDemo {public static ...

  3. 用PHP校验EMAIL地址的正确方法

    由John Klensin编写的互联网任务工程组(IETF)文档RFC 3696 "应用程序技术检查和命名转换"给出了多个真实有效的EMAIL地址,但很不幸的是这些地址却被大多数P ...

  4. js正则表达式 验证手机号,email地址和邮政编码等等等等。。。

    //手机号码的验证(13开头18开头和158,159开头,共11位) var re; var ss=document.getElementById('textbox3').val; re= /^(13 ...

  5. js正则表达式 验证手机号,email地址和邮政编码

    转载自:http://hi.baidu.com/648385674/item/bac6792c843b1ef050fd878c //手机号码的验证(13开头18开头和158,159开头,共11位) v ...

  6. 【廖雪峰】写一个验证Email地址的正则表达式

    最近在看廖雪峰的Python啦,已经看到正则了,突然想起来可以在博客记录一下下~ 无论对错都请多多指教,谢谢~ 要求: 廖雪峰Python教程链接 请尝试写一个验证Email地址的正则表达式.版本一应 ...

  7. [python] 使用正则表达式验证email地址是否有效

    假定email地址的必要形式为: xxxxxx@xxxxxxxx.xxxxxx 其他一概不作检查,对应的RE应为:[^@]+@[^@]+\.[^@]+ 验证脚本: import re p = re.c ...

  8. 输入一个Email地址,然后使用正则表达式验证该Email地址是否正确。

    输入一个Email地址,然后使用正则表达式验证该Email地址是否正确 . import java.util.regex.Pattern; import java.util.regex.Matcher ...

  9. 请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email —— python学习笔记

    Python正则表达式的练习 1.1 请尝试写一个验证Email地址的正则表达式.版本一应该可以验证出类似的Email someone@gmail.com bill.gates@microsoft.c ...

最新文章

  1. hdu4665 DFS
  2. 网工路由基础(8)路由重分布
  3. oracle一句话倒过来,oracle一些基本语句
  4. 2评分标准多少分_突发!财政部刚刚通知!2020年中级考试题目分值及评分标准大变!...
  5. 风险意识培训教程(续)
  6. mysql5.6.38 设置密码_Percona Server MySQL 5.6.38修改root密码(忘记root密码)
  7. Hadoop大数据简介
  8. 【华为设备命令最全大合集,快快收藏】
  9. 数据结构初阶——二叉树
  10. SFP光模块怎么配对光纤线缆
  11. WPF 触摸屏小键盘样式
  12. 数字图像处理——第三章 灰度变换与空间滤波
  13. c语言怎样自动对齐,c语言自动对齐原则
  14. 常用ansible命令
  15. 内存条 udimm rdimm 等和 ECC 功能
  16. 最新版微信 C# 微信HOOK 源代码,微信版本 3.0.0.57
  17. “21 天好习惯”第一期-7
  18. boot中jar包部署的方式读取classes下的文件
  19. 基于51单片机来开发的智能感应开盖垃圾桶
  20. 壁纸搜索系统/壁纸管理系统的设计与实现

热门文章

  1. DFS剪枝——poj3074数独
  2. git 删除文件后如何恢复
  3. 使用c#实现随机数猜数游戏
  4. IPS/IDS WAF
  5. 区块链实验三 : 区块链编程2
  6. input设置为只读模式
  7. Win10 x64 1903 搭建双机调试
  8. 呵呵……今天看到个很有意思的FLASH贴上来共享快乐!
  9. STM32开发 --- USART的3种发送方式
  10. python连接sap接口_python中调用api接口