JavaScript | 正则表达式
目录
正则表达式概述
正则表达式的特点
正则表达式在 JavaScript 中的使用
创建正则表达式
1. 通过调用 RegExp 对象的构造函数创建
2. 通过字面量创建
测试正则表达式 test
正则表达式中的特殊字符
正则表达式的组成
边界符
字符类
1. [] 方括号
2. [-] 方括号内部 范围符-
3. [^] 方括号内部 取反符^
4. 字符组合
量词符
案例:用户名验证
括号总结
预定义类
案例:表单验证
正则表达式中的替换
replace 替换
正则表达式参数
案例:敏感词过滤
正则表达式概述
正则表达式( Regular Expression )是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。
- 正则表通常被用来检索、替换那些符合某个模式(规则)的文本,例如验证表单:用户名表单只能输入英文字母、数字或者下划线, 昵称输入框中可以输入中文(匹配)。
- 正则表达式还常用于过滤掉页面内容中的一些敏感词(替换)
- 或从字符串中获取我们想要的特定部分(提取)等 。
正则表达式的特点
1. 灵活性、逻辑性和功能性非常的强。
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。比如: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
4. 实际开发,一般都是直接复制写好的正则表达式. 但是要求会使用正则表达式并且根据实际情况修改正则表达式. 比如用户名: /^[a-z0-9_-]{3,16}$/
正则表达式在 JavaScript 中的使用
创建正则表达式
1. 通过调用 RegExp 对象的构造函数创建
var 变量名 = new RegExp(/表达式/);
// 1. 利用RegExp对象来创建 正则表达式 regular expressionvar regexp = new RegExp(/123/);console.log(regexp);
2. 通过字面量创建
var 变量名 = /表达式/;
// 2. 利用字面量创建 正则表达式var rg = /123/;
// 注释中间放表达式就是正则字面量
测试正则表达式 test
- test() 正则对象方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false,其参数是测试字符串。
regexObj.test(str)
- regexObj 是写的正则表达式
- str 我们要测试的文本
- 就是检测str文本是否符合我们写的正则表达式规范.
var rg = /123/;// 3. test 方法用来检测字符串是否符合正则表达式要求的规范console.log(rg.test('abc')); // false
正则表达式中的特殊字符
正则表达式的组成
- 一个正则表达式可以由简单的字符构成,比如 /abc/,也可以是简单和特殊字符的组合,比如 /ab*c/ 。
- 其中特殊字符也被称为元字符,在正则表达式中是具有特殊意义的专用符号,如 ^ 、$ 、+ 等。
特殊字符非常多,可以参考:
- MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
- jQuery 手册:正则表达式部分
- 正则测试工具: http://tool.oschina.net/regex
边界符
正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符。
如果 ^ 和 $ 在一起,表示必须是精确匹配。
// 边界符 ^ $var rg = /abc/; // 正则表达式里面不需要加引号,不管是数字型还是字符串型// /abc/ 只要包含abc这个字符串,返回的都是trueconsole.log(rg.test('abc')); // trueconsole.log(rg.test('abcd')); // trueconsole.log(rg.test('aabcd')); // trueconsole.log('---------------------');var reg = /^abc/;// /^abc/ 必须以abc开头的字符串,才返回trueconsole.log(reg.test('abc')); // trueconsole.log(reg.test('abcd')); // trueconsole.log(reg.test('aabcd')); // falseconsole.log('---------------------');var reg1 = /^abc$/; // 精确匹配// /^abc$/ 要求必须是abc字符串,才符合规则console.log(reg1.test('abc')); // trueconsole.log(reg1.test('abcd')); // falseconsole.log(reg1.test('abcabc')); // false
字符类
- 字符类表示有一系列字符可供选择,只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内。
1. [] 方括号
/[abc]/.test('andy') // true []或者的意思 多选一
后面的字符串只要包含 abc 中任意一个字符,都返回 true 。
// 字符类:[]表示有一系列字符可供选择,只要匹配其中一个就可以了var rg = /[abc]/; // 只要包含有a 或者包含有b 或者包含有c 都返回trueconsole.log(rg.test('andy')); // trueconsole.log(rg.test('baby')); // trueconsole.log(rg.test('HELLO')); // falsevar rg1 = /^[abc]$/; // 三选一,只有是a 或者是b 或者是c 这个三个字母才返回trueconsole.log(rg1.test('a')); // trueconsole.log(rg1.test('aa')); // false
2. [-] 方括号内部 范围符-
/^[a-z]$/.test(c') // true
方括号内部加上 - 表示范围,这里表示 a 到 z 26个小写英文字母都可以。
var rg2 = /^[a-z]$/; // 26个小写英文字母,任何一个字母都返回trueconsole.log(rg2.test('y')); // trueconsole.log(rg2.test('Y')); // falseconsole.log(rg2.test(1)); // false
3. [^] 方括号内部 取反符^
/[^abc]/.test('andy') // false
- 方括号内部加上 ^ 表示取反,只要包含方括号内的字符,都返回 false 。
- 注意和边界符 ^ 区别,边界符写到方括号外面。
// 如果中括号里面有^ 表示取反的意思,千万和我们边界符^ 别混淆var rg4 = /^[^a-zA-Z0-9_-]$/;console.log(rg4.test('-')); // falseconsole.log(rg4.test('!')); // true
4. 字符组合
// 字符组合// 26个英文字母(大写和小写都可以),或者数字0-9,或者_下划线,或者-短横线,任何一个字母都返回truevar rg3 = /^[a-zA-Z0-9_-]$/; // 多选一的过程console.log(rg3.test('-')); // trueconsole.log(rg3.test('N')); // trueconsole.log(rg3.test('7')); // trueconsole.log(rg3.test('_')); // trueconsole.log(rg3.test('_000')); // false
量词符
量词符用来设定某个模式出现的次数。
- * 相当于>=0 可以出现0次或者很多次
+ 相当于 >=1 可以出现1次或者很多次
? 相当于 1 || 0
{3} 重复3次
{3,} 大于等于 3
{3,12} 大于等于3 并且 小于等于12
// * 相当于>=0 可以出现0次或者很多次var reg = /^a*$/;console.log(reg.test('')); // trueconsole.log(reg.test('a')); // trueconsole.log(reg.test('aaaa')); // true// + 相当于 >=1 可以出现1次或者很多次var reg = /^a+$/;console.log(reg.test('')); // falseconsole.log(reg.test('a')); // trueconsole.log(reg.test('aaaa')); // true// ? 相当于 1 || 0var reg = /^a?$/;console.log(reg.test('')); // trueconsole.log(reg.test('a')); // trueconsole.log(reg.test('aaaa')); // false// {3} 重复3次var reg = /^a{3}$/;console.log(reg.test('')); // falseconsole.log(reg.test('a')); // falseconsole.log(reg.test('aaa')); // true// {3,} 大于等于 3var reg = /^a{3,}$/;console.log(reg.test('')); // falseconsole.log(reg.test('a')); // falseconsole.log(reg.test('aaa')); // trueconsole.log(reg.test('aaaaaaa')); // true// {3,12} 大于等于3 并且 小于等于12var reg = /^a{3,12}$/;console.log(reg.test('a')); // falseconsole.log(reg.test('aaa')); // trueconsole.log(reg.test('aaaaaaa')); // trueconsole.log(reg.test('aaaaaaaaaaaaaaaaaaaaa')); // false
案例:用户名验证
- 功能需求:
- 如果用户名输入合法, 则后面提示信息为 : 用户名合法,并且颜色为绿色
- 如果用户名输入不合法, 则后面提示信息为: 用户名不符合规范, 并且颜色为绿色
分析:
- 用户名只能为英文字母,数字,下划线或者短横线组成, 并且用户名长度为 6~16位.
- 首先准备好这种正则表达式模式 /$[a-zA-Z0-9-_]{6,16}^/
- 当表单失去焦点就开始验证.
- 如果符合正则规范, 则让后面的span标签添加 right 类.
- 如果不符合正则规范, 则让后面的span标签添加 wrong 类.
<body><input type="text" class="uname"> <span class="message">请输入用户名</span><script>// 量词是设定某个模式出现的次数var reg = /^[a-zA-Z0-9_-]{6,16}$/; // 数字 字母 下划线 短横线 多选一// 获取元素var uname = document.querySelector('.uname');var message = document.querySelector('.message');// 当表单失去焦点uname.addEventListener('blur', function () {if (reg.test(this.value)) {message.className = 'right';message.innerHTML = '用户名格式输入正确';} else {message.className = 'wrong';message.innerHTML = '用户名不符合规范';}})</script>
</body>
括号总结
- 大括号 量词符. 里面表示重复次数
- 中括号 字符集合. 匹配方括号中的任意字符.
- 小括号 表示优先级
// 中括号 字符集合 匹配括号中的任意字符/^[abc]$/; // a || b || c// 大括号 量词符 里面表示重复次数/^abc{3}$/; // 只是让c重复三次 abccc// 小括号 表示优先级/^(abc){3}$/; // 让abc重复三次
在线测试:https://c.runoob.com/front-end/854/
预定义类
预定义类指的是某些常见模式的简写方式。
正则表达式里面的或者 |
座机号码验证:
// 座机号码验证:全国座机号码 两种格式:010-12345678 或者 0530-1234567// 正则里面的或者符号 | var reg = /^\d{3}-\d{8}|\d{4}-\d{7}$/;var reg = /^\d{3,4}-\d{7,8}$/;console.log(reg.test('0311-2345678')); // true
案例:表单验证
分析:
- 手机号码: /^1[3|4|5|7|8][0-9]{9}$/
- QQ: [1-9][0-9]{4,} (腾讯QQ号从10000开始)
- 昵称是中文: ^[\u4e00-\u9fa5]{2,8}$ 从第一个汉字到第二个汉字 2-8位
- 短信验证码:^\d{6}$ 六位数字
- 密码:^[a-zA-Z0-9-_]{6,16}$ 6-16位的数字字母-和_
window.onload = function () {var regtel = /^1[3|4|5|7|8]\d{9}$/; // 手机号码的正则表达式 var regqq = /^[1-9]\d{4,}$/; // qq号的正则表达式 qq从10000开始 var regnc = /^[\u4e00-\u9fa5]{2,8}$/; // 昵称的正则表达式var regmsg = /^\d{6}$/; //短信验证码的正则表达式 六位数字var regpwd = /^[a-zA-Z0-9-_]{6,16}$/; // 密码的正则表达式 6-16位的数字字母-和_var tel = document.querySelector('#tel');var qq = document.querySelector('#qq');var nc = document.querySelector('#nc');var msg = document.querySelector('#msg');var pwd = document.querySelector('#pwd');var surepwd = document.querySelector('#surepwd');regexp(tel, regtel);regexp(qq, regqq);regexp(nc, regnc);regexp(msg, regmsg);regexp(pwd, regpwd);// 表单验证的函数function regexp(ele, reg) {ele.addEventListener('blur', function () {if (reg.test(this.value)) {this.nextElementSibling.className = 'success';this.nextElementSibling.innerHTML = '<i class="success_icon"></i>输入正确';} else {this.nextElementSibling.className = 'error';this.nextElementSibling.innerHTML = '<i class="error_icon"></i>格式不正确,请重新输入';}})}surepwd.addEventListener('blur', function () {if (this.value == pwd.value) {this.nextElementSibling.className = 'success';this.nextElementSibling.innerHTML = '<i class="success_icon"></i>输入正确';} else {this.nextElementSibling.className = 'error';this.nextElementSibling.innerHTML = '<i class="error_icon"></i>两次输入密码不一致';}})
}
正则表达式中的替换
replace 替换
- replace() 方法可以实现替换字符串操作,用来替换的参数可以是一个字符串或是一个正则表达式。
// replace 替换var str = 'andy和red';var newStr = str.replace(/andy/, 'baby');console.log(newStr);
- 第一个参数: 被替换的字符串 或者 正则表达式
- 第二个参数: 替换为的字符串
- 返回值是一个替换完毕的新字符串
正则表达式参数
/表达式/[switch]
switch(也称为修饰符) 按照什么样的模式来匹配. 有三种值:
- g:全局匹配
- i:忽略大小写
- gi:全局匹配 + 忽略大小写
text.value.replace(/激情/g, '**'); // 全局匹配
案例:敏感词过滤
<textarea name="" id="message" cols="30" rows="10"></textarea><button>提交</button><div></div><script>var text = document.querySelector('textarea');var btn = document.querySelector('button');var div = document.querySelector('div');btn.onclick = function () {div.innerHTML = text.value.replace(/激情|gay/g, '**'); // 敏感词过滤 全局匹配}</script>
JavaScript | 正则表达式相关推荐
- JavaScript正则表达式快速判断技巧
原文:JavaScript正则表达式快速判断技巧 这里是JS的正则的一点心得,并不是最完整的规则汇总,更侧重实际运用中的快速判断,初学者接触正则之后往往会被一堆星号括号给弄晕,有了一些速判技巧就能从整 ...
- javascript 正则表达式详解
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个 ...
- 经典JavaScript正则表达式实战
来源:http://www.cainiao8.com/web/js_note/js_regular_expression_blueidea.html 目录 1. 正则表达式实战...1 2. 匹 ...
- 温故知新 javascript 正则表达式
温故知新 javascript 正则表达式 转载:http://www.cnblogs.com/libinqq/archive/2008/07/31/1257699.html 很长时间没看 正则表达式 ...
- javascript正则表达式小结
总结了一下javascript正则表达式的内容.表格形式,一目了然.辅以Example图形解释. 一.元字符 二.反义字符 三.转义字符 四.重复匹配 五.分组/捕获 六.贪婪与惰性 七.修饰符 ex ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- 好程序员web前端分享使用JavaScript正则表达式如何去掉双引号
为什么80%的码农都做不了架构师?>>> 好程序员web前端分享使用JavaScript正则表达式如何去掉双引号,最近接了一个项目,项目需求需要用js正则表达式过滤掉页面文本域 ...
- JavaScript 正则表达式
JavaScript 正则表达式 版权声明:未经授权,严禁转载! 正则表达式 什么是正则表达式 正则表达式是用来描述一种特定格式的字符规则的表达式. 正则表达式常用语在一段文本中搜索,匹配或者替换特 ...
- js php 正则差别,JavaScript正则表达式的浏览器的差异
JavaScript中的正则表达式在不同的浏览器中得到的结果可能会有差异,下面把正则表达式在五大主流浏览器(IE.Firefox.Chrome.Safari.Opera,以当前版本为准)之间的差异整理 ...
- 玩转JavaScript正则表达式
Why Regular Expression 我们先来看看,我们干哈要学正则表达式这玩意儿: 复杂的字符串搜寻.替换工作,无法用简单的方式(类似借助标准库函数)达成. 能够帮助你进行各种字符串验证. ...
最新文章
- 甘利俊一 | 信息几何法:理解深度神经网络学习机制的重要工具
- java ADT生成带签名的apk
- 9.2 mnist_with_summaries tensorboard 可视化展示
- Improving RGB-D SLAM in dynamic environments: A motion removal approach
- idea中修改jsp文件不用再重启tomcat的方法
- Ionic 4.0.2 发布,移动应用开发框架
- java第七章jdbc课后简答题_java学习路线流程
- java 文件分割器_Java分割器
- 数学基础加强1---机器学习与数学分析
- AutoPtr 的局限性
- VS Code下载安装
- 现代控制理论公式大赏
- Zookeeper框架Curator使用
- Python面向对象06/反射/双下方法
- 【英语学习】【医学】生物化学(biochemistry)系统
- 【分享】一年级古诗古朗月行语文知识点心田花开汇总
- 环信php创建群组,群组@功能
- 淘宝精准库存接口获取商品ID下所有的sku精准库存
- Robot Arm from solidworks to ros
- 支付宝与微信新年红包战之我见